在iOS 9中,通过HTTPS连接IP地址的服务器时出现kCFStreamErrorDomainSSL,-9802错误。

23

我们有一个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"。

我已经尝试了覆盖主机名,但似乎没有改变任何东西。

我无法找到太多关于ATS的官方文档。也许使用IP地址连接不起作用?


可能是重复的问题:NSURLSession/NSURLConnection HTTP load failed - Tariq
5个回答

29

iOS9要求服务器只支持TLSv1.2并支持完美前向保密。此外,应用程序还需要支持IPV6,包括不使用硬编码的IP地址。建议使用NSURLSession。否则,必须在应用程序plist中添加异常条目。

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

有关详细信息,请参见Steven Peterson的博客


很棒的博客参考资料 +1! - Satheesh
1
一定要阅读那篇博客文章。在最后,他解释了如何禁用它以及为什么你可能不应该这样做。 - Sam Soffes
当您想要通过 IP (没有 SSL) 将应用程序连接到内部网络上的服务器时,进行内部测试如何? - Brabbeldas
你必须将IP地址加入白名单。或者,你可以加入那些支持安全性并设置SSL的人。 - zaph
4
我的服务器支持TLS 1.2。我已添加了一个例外(包括子域名)以仅绕过前向保密,但我仍然收到此错误(kCFStreamErrorDomainSSL,-9802)。 - Nicolas Miari
1
@NicolasMiari,你找到解决方法了吗?在我的iOS 9测试设备上,它可以构建并运行,但在我的iOS 10设备上,我得到了你发布的错误。我已经尝试了我所知道的SO上的所有方法,但没有任何方法可以让应用程序连接。我只能加载我的启动画面并获得你发布的错误。 - billy_comic

5
您可以在 "Info.plist" 文件中添加以下内容,它将允许非安全连接:
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

3
我找到了另一个 Stack Overflow 答案,其中列出了服务器上满足 iOS 9 默认 App Transport Security 要求的确切新要求的清单: iOS 9 安全服务器要求清单 希望这有所帮助。

2

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

HTTP load failed (kCFStreamErrorDomainSSL, -9813)

在开发中尝试连接本地主机服务器时出现问题。

使用React Native项目在本地开发时,连接到使用自签名证书提供的API,我将系统设置为信任该证书,但是我花了一段时间才意识到,我还需要让IOS模拟器接受我的证书作为可信证书才能解决这个错误。

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

希望这对某些人有所帮助,因为在我明白之前,我一直在困惑!


1

解决方案1:

如果你正在寻找解决方法,请使用以下方法:

  1. 添加类型为boolean、值为trueNSAllowsArbitraryLoads键。

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

Screenshot 1

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

解决方案2:

您在服务器上应用的SSL证书应该是TLSv2.0最低类型,因为iOS 10需要这样做。 详见链接

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

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

Screenshot 2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接