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

iOS 9 ATS SSL error with supporting server

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

那可能是什么问题?

查看苹果提供的this doc

我在 iOS 9 上的运行时遇到了类似的问题,我所做的修复是将 NSAppTransportSecurity 字典添加到我的 info.plist 文件中,其中包含 NSAllowsArbitraryLoads Bool 设置为 true 并在清理和重建后它工作了。

希望对您有所帮助!

在 iOS9 中,Apple 添加了名为 App Transport Security (ATS) 的新功能。

ATS 在网络调用期间强制实施最佳实践,包括使用 HTTPS。

Apple 预发布文档:

ATS prevents accidental disclosure, provides secure default behavior, and is easy to adopt. You should adopt ATS as soon as possible, regardless of whether you’re creating a new app or updating an existing one.

If you’re developing a new app, you should use HTTPS exclusively. If you have an existing app, you should use HTTPS as much as you can right now, and create a plan for migrating the rest of your app as soon as possible.

在您的 info.plist 中添加 Below 键,然后查看。

<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>

A​​pple 已发布 App Transport Security 的完整要求列表。

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

这是完整的检查清单:

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

接受的密码是:

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

对我来说代理被阻止尝试使用来自不同来源的互联网将解决问题。 Wifi、局域网等

对于 iOS9,我遇到了同样的问题: 虽然 SSLlab 结果显示我的服务器上的协议/密码没有问题,但与一个特定 URL 的连接在 iPad 运行 iOS/9.3.5 上失败了SSL-Error:

Connection cannot be established.

我的愚蠢错误是,我有一个重定向,即在 NGINX 中(在 Apache 中类似):

rewrite /calendar     $scheme://www.example.org/resources/calendar;

如果用户通过设置访问 /calender

https://example.org/calendar

服务器重定向到另一个域,破坏了 SSL-connection 的建立。

如下设置重定向修复了它:

rewrite /calendar     $scheme://$server_name/resources/calendar;