我安装了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
。
那可能是什么问题?
答案 0 :(得分:31)
Apple已发布App Transport Security的完整要求列表。
原来我们正在使用TLS v1.2但是缺少其他一些要求。
以下是完整的核对清单:
接受的密码为:
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
答案 1 :(得分:11)
在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>
答案 2 :(得分:5)
查看苹果提供的this doc。
我在运行时在iOS 9上遇到了类似的问题,我修复它的问题是将NSAppTransportSecurity
字典添加到我的info.plist
文件中并设置了NSAllowsArbitraryLoads
Bool
到true
并且在清洁和重建之后它起作用了。
我希望这有帮助!
答案 3 :(得分:2)
对我来说代理被阻止尝试使用来自不同来源的互联网将解决问题。 Wifi,Lan等。
答案 4 :(得分:0)
对于iOS9,我遇到了同样的问题: 虽然SSLlab结果显示我的服务器上的协议/密码没有问题,但在运行带有SSL-Error的iOS / 9.3.5的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;