kCFStreamErrorDomainSSL,-9802 在 iOS 9 中通过 HTTPS 通过 IP 地址连接到服务器时

kCFStreamErrorDomainSSL, -9802 when connecting to a server by IP address through HTTPS in iOS 9

我们有一个 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 地址连接不应该?

iOS9要求服务器只支持TLSv1.2,支持完美前向安全

应用程序还需要支持 IPV6,包括不使用 hard-coded IP 地址。建议是使用NSURLSession。否则必须在应用程序列表中添加异常。

参见 WWDC-15 session "Security and your Apps"。

有关详细信息,请参阅 Steven Peterson's Blog

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

希望对您有所帮助。

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

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

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

HTTP load failed (kCFStreamErrorDomainSSL, -9813)

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

使用连接到 API 的反应本机项目在本地开发并使用自签名证书我将我的系统设置为信任该证书,但我花了一段时间才意识到我还需要 IOS 模拟器接受我的证书作为信任来克服这个错误。

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

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

解决方案 1:

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

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

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

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

方案二:

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. 添加 NSTemporaryExceptionMinimumTLSVersion 类型为 String 的键,值为 TLSv1.2

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