我收到以下错误消息(每次尝试都相同)
2016-07-20 20:09:28.013 MyApp [1140:374263] CFNetwork SSLHandshake失败(-9806) 2016-07-20 20:09:28.014 MyApp [1140:374263] NSURLSession / NSURLConnection HTTP加载失败(kCFStreamErrorDomainSSL,-9806) error =可选(错误域= NSURLErrorDomain代码= -1200"发生SSL错误,无法与服务器建立安全连接。" UserInfo = {_ kCFStreamErrorCodeKey = -9806,NSLocalizedRecoverySuggestion =您要无论如何连接到服务器?,NSUnderlyingError = 0x154dda750 {错误域= kCFErrorDomainCFNetwork代码= -1200"(null)" UserInfo = {_ kCFStreamPropertySSLClientCertificateState = 0,_kCFNetworkCFStreamSSLErrorOriginalValue = -9806,_kCFStreamErrorDomainKey = 3,_kCFStreamErrorCodeKey = -9806 ,NSLocalizedDescription =发生了SSL错误,无法建立与服务器的安全连接。,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
,其中包含Apples root CA list
- 返回代码为Verify return code: 0 (ok)
我还运行了几个ssl诊断工具网站,例如digicert,它没有给出任何错误结果。
我可以从iOS设备上的Safari加载域,也可以从我的计算机加载chrome,而不必接受"不受信任的证书"。
有什么建议吗?
答案 0 :(得分:2)
如果有人遇到同样的问题,那就回答我自己的问题。 在提问时,我们的加密(使用的证书的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>
在路上的某个时候,他们将此更改为默认的土地。我不确定这是什么时候,但在iOS 10.0之后它从来都不是问题。