支持服务器的 iOS 9 ATS SSL 错误
Posted
技术标签:
【中文标题】支持服务器的 iOS 9 ATS SSL 错误【英文标题】:iOS 9 ATS SSL error with supporting server 【发布时间】:2015-07-05 15:02:33 【问题描述】:我安装了 Xcode 7 并尝试在 ios 9 下运行我的应用程序。
我收到了臭名昭著的错误:Connection failed! Error - -1200 An SSL error has occurred and a secure connection to the server cannot be made.
问题是我的服务器确实支持 TLSv1.2,而且我正在使用NSURLSession
。
那会是什么问题呢?
【问题讨论】:
【参考方案1】:Apple 已发布 App Transport Security 的完整要求列表。
原来我们正在使用 TLS v1.2,但缺少一些其他要求。
这是完整的检查清单:
-
TLS 至少需要 1.2 版。
连接密码仅限于那些提供前向保密的密码(请参阅下面的密码列表。)
该服务需要至少使用 SHA256 指纹的证书,该指纹具有 2048 位或更高的 RSA 密钥,或者 256 位或更高的椭圆曲线 (ECC) 密钥。
无效的证书会导致硬故障和无连接。
接受的密码是:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
【讨论】:
我们如何检查这些项目? Apple 技术说明并没有提供更多信息:developer.apple.com/library/prerelease/ios/technotes/… 测试转到SSL Labs 并输入您的服务器网址。它将测试您的证书并对您的设置进行评分。 您可以像我一样包含另一组密码,因为 paypal 不支持这些密码,***.com/questions/32869268/… 我们通过更新 ssl 证书以使用 SHA2 并启用 TLS v1.2 解决了这个问题 当你想将应用连接到内部网络上的服务器时,如何进行内部测试?【参考方案2】:在 iOS9 中,Apple 添加了名为 App Transport Security(ATS) 的新功能。
ATS 在网络调用期间强制执行最佳做法,包括使用 HTTPS。
Apple 预发布文档:
ATS 可防止意外泄露,提供安全的默认行为, 并且易于采用。你应该尽快采用ATS, 无论您是创建新应用还是更新 现有的。
如果您正在开发新应用,则应仅使用 HTTPS。如果 你有一个现有的应用程序,你应该尽可能多地使用 HTTPS 现在,并创建一个迁移应用程序其余部分的计划 尽快。
在您的 info.plist 中添加下方键,然后查看。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
你甚至可以添加特定的异常,
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>testdomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<false/>
<key>NSExceptionAllowInsecureHTTPSLoads</key>
<false/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowInsecureHTTPSLoads</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
...
</dict>
</dict>
【讨论】:
我的服务器正在使用 TLSv1.2 而我正在使用 NSUrlSession - 所以它应该自动为我工作,不是吗?我不想在我的应用中禁用 TLS。 另一种可能是服务器上的证书可能没有由授权的 CA 签名 我刚刚注意到 plist 中的任何地方都为最低版本设置了值 1.2。这不是新的默认版本吗? 可能是..你检查过你的服务器端证书吗? 添加 NSAllowsArbitraryLoads-key 是否是使用本地服务器(通过 IP 和无 SSL)进行内部测试的方式?【参考方案3】:查看苹果提供的this doc。
我在 iOS 9 上运行时遇到了类似的问题,我为修复它所做的是将 NSAppTransportSecurity
字典添加到我的 info.plist
文件中,并将 NSAllowsArbitraryLoads
Bool
设置为 true
并在清理后重建它工作。
我希望这会有所帮助!
【讨论】:
我的服务器正在使用 TLSv1.2 而我正在使用 NSUrlSession - 所以它应该自动为我工作,不是吗?我不想在我的应用中禁用 TLS。 可能是临时解决方案 老实说,我认为这是一种解决方法,我无法使用这种配置,所以我正在等待是否有新的文档出来。如果你们中的任何人使用 Charles Proxy,他们有一篇关于此的文章,而且我知道很多人也写过有关此解决方法的文章。 你所做的是禁用了新的 ssl 检查。不推荐。 @aroth 几乎没有警告? WWDC 是几个月前的事了。正确配置 SSL 并不难。【参考方案4】:对我来说,代理被阻止尝试使用来自不同来源的互联网将解决问题。 Wifi、局域网等
【讨论】:
没想到会这样。但解决了我的问题。谢谢。 该死的,我在生产应用程序失败时发现了这个问题。开始出汗。阅读这篇文章,关闭 wifi,使用移动数据并工作...... ufff。现在好多了...谢谢。【参考方案5】:在 iOS9 中,我遇到了同样的问题: 虽然SSLlab 结果显示我的服务器上的协议/密码没有问题,但在运行 iOS/9.3.5 且 SSL 错误的 iPad 上连接到一个特定 URL 失败:
Connection cannot be established.
我的愚蠢错误是,我有一个重定向,即在 nginx 中(在 Apache 中类似):
rewrite /calendar $scheme://www.example.org/resources/calendar;
如果用户通过设置访问/calender
:
https://example.org/calendar
服务器重定向到另一个域,破坏了 SSL 连接的建立。
设置重定向如下修复它:
rewrite /calendar $scheme://$server_name/resources/calendar;
【讨论】:
以上是关于支持服务器的 iOS 9 ATS SSL 错误的主要内容,如果未能解决你的问题,请参考以下文章
iOS 10 适配 ATS(app支持https通过App Store审核)
从 Amazon S3 SSL 错误下载 iOS 9 应用程序:TLS 1.2 支持