【问题标题】:kCFStreamErrorDomainSSL, -9802 when connecting to a server by IP address through HTTPS in iOS 9kCFStreamErrorDomainSSL, -9802 在 iOS 9 中通过 HTTPS 通过 IP 地址连接到服务器时
【发布时间】:2015-08-27 00:26:01
【问题描述】:

我们有一个 iOS 应用程序通过 HTTPS 连接到我们的服务器。当应用使用新的 iOS 9 SDK 构建并在 iOS 9 下运行时,会出现以下错误:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

该应用使用带有固定证书的 AFNetworking 1.3.4。如果我使用其 IP 地址连接到服务器,则会出现问题。如果我添加 NSAllowsArbitraryLoads 配置,或者我使用其域名连接到服务器,它就可以工作。

Tomcat 连接器配置了 sslEnabledProtocols="TLSv1,TLSv1.1,TLSv1.2"。

我尝试过overriding the host name,但似乎没有任何改变。

我还没有找到很多关于 ATS 的官方文档。也许用IP地址连接不应该工作?

【问题讨论】:

标签: ios iphone afnetworking ios9 app-transport-security


【解决方案1】:

iOS9 要求服务器仅支持 TLSv1.2 并支持完美的前向安全性。

应用还需要支持 IPV6,包括不使用硬编码的 IP 地址。建议使用NSURLSession。否则必须在应用 plist 中添加异常。

请参阅 WWDC-15 会议“安全性和您的应用程序”。

详情另见Steven Peterson's Blog

【讨论】:

  • 很棒的博客参考 +1!
  • 一定要阅读那篇博文。最后,他解释了如何禁用此功能以及您可能不应该这样做的原因。
  • 如果你想通过IP(没有ssl)将应用连接到内部网络上的服务器时,如何进行内部测试?
  • 我的服务器确实支持 TLS 1.2。我添加了一个例外(包括子域)以仅绕过前向保密,但我仍然收到这个错误(kCFStreamErrorDomainSSL, -9802
  • @NicolasMiari 你找到解决方案了吗?在我的 iOS 9 测试设备上,它可以构建并运行,但在我的 iOS 10 设备上,我收到了您发布的错误。我已经尝试了我在 SO 上看到的所有内容(我知道),没有任何东西可以让应用程序连接。我只是加载我的初始屏幕并收到您发布的错误。
【解决方案2】:

您可以将其添加到您的“Info.plist”文件中,它将允许非安全连接:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

【讨论】:

    【解决方案3】:

    我找到了另一个堆栈溢出答案,其中包含对服务器的确切新要求清单,以完全满足 iOS 9 默认应用程序传输安全要求: iOS 9 Security Server requirements Checklist

    希望对您有所帮助。

    【讨论】:

      【解决方案4】:

      我在这个问题上卡了一段时间,尝试了 Info.plist 中的所有技巧,但仍然出现错误:

      HTTP load failed (kCFStreamErrorDomainSSL, -9813)
      

      在开发中尝试连接到本地主机服务器时。

      使用连接到使用自签名证书服务的 API 的 react 本地项目进行本地开发克服这个错误。

      在您的模拟器的主屏幕中,您应该能够将证书文件拖到模拟器中以提示它添加证书配置文件。 或者,如果证书可以通过模拟器的 safari 浏览器中的 localhost url 访问,您也许可以通过 safari 接受它。

      希望这对我在点击之前绕圈子的人有所帮助!

      【讨论】:

        【解决方案5】:

        解决方案 1:

        如果您正在寻找work around,请使用以下方法:

        1. 添加 NSAllowsArbitraryLoads 类型为 boolean 且值为 true 的键。

        您的 Info.plist 文件应如下所示:

        但是,不推荐使用这种方法,因为它允许所有不安全的连接。

        解决方案 2:

        SSL certificate that you apply on Server should be of type TLSv2.0 minimum since iOS 10 requires this. 详情请查看link

        1. 添加 NSIncludesSubdomains 类型为 boolean 且值为 true 的键
        2. 添加 NSTemporaryExceptionAllowsInsecureHTTPLoads 类型为 boolean 且值为 true 的键
        3. 添加 String 类型的 NSTemporaryExceptionMinimumTLSVersion 键,其值为 TLSv1.2

        您的 Info.plist 文件应如下所示:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-18
          • 2011-10-04
          • 1970-01-01
          • 2014-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-02
          相关资源
          最近更新 更多