“发生 SSL 错误,无法与服务器建立安全连接”,证书已验证

Sim*_*Vie 5 ssl https ios

我收到以下错误消息(每次尝试都相同)

2016-07-20 20:09:28.013 MyApp[1140:374263] CFNetwork SSLHandshake 失败 (-9806) 2016-07-20 20:09:28.014 MyApp[1140:374263] HTTPStreamSession/NSURL 失败 (CFNetwork SSLHandshake) (-9806) ) error=Optional(Error Domain=NSURLErrorDomain Code=-1200 “发生了 SSL 错误,无法与服务器建立安全连接。” UserInfo={_kCFStreamErrorCodeKey=-9806, NSLocalizedRecoverySuggestion=您是否仍要连接到服务器?, NSUnderlyingError=0x154dda750 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9806, _kCFNetworkCFStreamSSLErrorOriginalValue=-9806, _kCFStreamErrorDomainKey=3, NSStreamKey=3, NSStreamKey=3, 并且发生了错误,发生了SSLStreamDescription=3,发生了错误无法与服务器建立安全连接。,NSErrorFailingURLKey=https://example.com:8080/api/login , NSErrorFailingURLStringKey= https://example.com:8080/api/login , _kCFStreamErrorDomainKey=3})

该证书是由letsencrypt 提供的经过验证的证书。我一遍又一遍地测试了我的 Web 服务器配置,一切似乎都应该如此。

运行该命令openssl s_client -connect example.com:8080/api/login -tls1_2会给出所有预期的结果:

- 验证权限为DST Root CA X3,包含在苹果的根CA列表中

- 返回代码是 Verify return code: 0 (ok)

我还运行了几个 ssl 诊断工具网站,例如digicert,没有给出任何错误结果。


我可以从 iOS 设备上的 Safari 加载域,也可以从我的计算机加载 chrome,而无需接受“不受信任的证书”。

有什么建议?

Sim*_*Vie 3

如果有人遇到同样的问题,我会回答我自己的问题。在提出问题时,Let's Encrypt(所使用的证书的 CA)不支持其 https 证书的前向保密(至少不是我得到的证书)。苹果在当时使用的 iOS 版本中默认要求这样做(我相信它是在 9.5 左右,但我可能在这里弄错了)。

为了绕过前向保密的要求,可以在 Info.plist 中的域例外下指定。

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>example.com</key>
    <dict>
      <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
  </dict>
</dict>
Run Code Online (Sandbox Code Playgroud)

在路上的某个时候,他们将其更改为默认着陆错误。我不确定这是什么时候的事,但在 iOS 10.0 之后,这再也不是问题了。