App Transport Security 阻止 HTTPS

App Transport Security blocks HTTPS

我对 ATS 有疑问。 我正在使用 XCode 9.1,我的开发目标是 11.0。 我正在使用 react-native 0.49

进行开发

我的程序正在获取具有有效 (google chrome) letsencrypt 证书的 https (https://www.xxxx.com) 资源. 提取仅在 NSAllowsArbitraryLoads 设置为 true 时有效,设置为 false 时提取被阻止(调试)?

我正在使用临时域 (https://xxxx.no-ip.org) 进行一些测试。此域还具有有效的 letsencrypt 证书。在这种情况下一切正常。

我能看到的两个主机之间的唯一区别是测试域是单域主机,生产主机是多域主机。 有人有什么建议吗?

此致,

哈利


调试出来: CFNetwork 诊断 [1:1187] 12:38:08.258 { 失败了:(空) 装载机:{url = https://.... 错误:错误域=kCFErrorDomainCFNetwork 代码=-1200“(空)”用户信息={_kCFStreamPropertySSLClientCertificateState=0,_kCFNetworkCFStreamSSLErrorOriginalValue=-9802,_kCFStreamErrorDomainKey=3,_kCFStreamErrorCodeKey=-9802}

这是我的info.plist部分

<key>NSAppTransportSecurity</key>
  <dict>
  <key>NSAllowsArbitraryLoads</key>
  <false/>
  <key>NSExceptionDomains</key>
  <dict>
  <key>xxxx.no-ip.org</key>
  <dict/>
  <key>localhost</key>
  <dict>
  <key>NSExceptionAllowsInsecureHTTPLoads</key>
  <true/>
  </dict>
  <key>xxxx.com</key>
  <dict>
  <key>NSIncludesSubdomains</key>
  <true/>
</dict>  </dict>  </dict>

有时会发生这种情况,因为您的证书不符合 Apple 要求的所有 TLS 版本要求。

尝试将此添加到域 https://www.xxxx.com

<key>NSExceptionRequiresForwardSecrecy</key>
<true/>

并且不要忘记包含子域:

<key>NSIncludesSubdomains</key>
<true/>

如果这没有帮助,那么您可以尝试查找您想要支持的最低 TLS 版本:

<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>

如果所有过去的都不起作用,请尝试添加:

<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>

如果您尝试通过 HTTPS 连接,使用 NSExceptionAllowsInsecureHTTPLoads 应该不会有任何作用。有没有可能你的URL (https://www.xxxx.com) is redirecting traffic to http://www.xxxx.com?

还有其他例外情况会影响 HTTPS 流量,这些例外情况将允许不满足 HTTPS 的所有要求(例如转发保密性、TLS 版本、密钥强度)的 HTTPS 连接。您需要做的是弄清楚它失败的确切原因。

要测试 URL 是否符合 ATS,请在 Mac 上使用 nscurl --ats-diagnostics <url> 命令。您可以在 this post.

中找到有关 ATS 的更多信息,以及如何使用/解释上述 nscurl 命令的结果。

此外,您可以通过提高 CFNETWORK_DIAGNOSTICS 级别来增加日志记录以获取有关失败原因的更多详细信息。您可以了解更多相关信息 here.