【问题标题】:iOS 9 ATS SSL error with supporting server支持服务器的 iOS 9 ATS SSL 错误
【发布时间】:2015-09-22 18:20:57
【问题描述】:

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

那会是什么问题呢?

【问题讨论】:

    标签: ios objective-c ssl nsurlsession ios9


    【解决方案1】:

    Apple 已发布 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
    

    【讨论】:

    • 我们如何检查这些项目? Apple 技术说明并没有提供更多信息:developer.apple.com/library/prerelease/ios/technotes/…
    • 测试转到SSL Labs 并输入您的服务器网址。它将测试您的证书并对您的设置进行评分。
    • 您可以像我一样包含另一组密码,因为 paypal 不支持这些密码,stackoverflow.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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 2021-12-17
      • 2020-05-27
      • 1970-01-01
      • 2015-12-23
      • 2015-12-06
      相关资源
      最近更新 更多