支持服务器的 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 支持

iOS10 适配 ATS(app支持https通过App Store审核)

iOS10 适配 ATS(app支持https通过App Store审核) 韩俊强的博客

苹果强制HTTPS,目前应该怎么解决APP问题?

2017 苹果强制https