支持服务器的iOS 9 ATS SSL错误

时间:2015-07-05 15:02:33

标签: ios objective-c ssl nsurlsession ios9

我安装了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

那可能是什么问题?

5 个答案:

答案 0 :(得分:31)

Apple已发布App Transport Security的完整要求列表。

原来我们正在使用TLS v1.2但是缺少其他一些要求。

以下是完整的核对清单:

  1. TLS至少需要1.2版本。
  2. 连接密码仅限于提供前向保密的密码(请参阅下面的密码列表。)
  3. 该服务需要至少使用带有2048位或更高RSA密钥的SHA256指纹或256位或更高椭圆曲线(ECC)密钥的证书。
  4. 无效的证书会导致硬故障并且无法连接。
  5. 接受的密码为:

    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 Booltrue并且在清洁和重建之后它起作用了。

我希望这有帮助!

答案 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;