我有一个使用SSL / HTTPS与服务器通信的iOS应用程序。服务器提供的证书可以通过TLSv1.2(App Transport Security的主要要求)运行。演示此内容的示例网址(通过检查证书可以验证TLSv1.2)是https://api.branon.co.uk/checkOnline。
然而,该应用程序正在抛出与App Transport Layer相关的错误 - 当Google搜索时出现的错误意味着它,因为服务器不能通过TLSv1.2工作。示例错误是:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
和
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)
我甚至在plist文件中添加了一堆例外,例如:
<dict>
<key>NSExceptionDomains</key>
<dict>
<key><my top level domain - the app uses a subdomain - allowed below></key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
</plist>
但这并没有改变结果。
使用的证书是从StartCom颁发的免费证书。我的nginx配置如下(仅供参考)。
server {
listen [::]:443 ssl;
listen 443 ssl;
ssl on;
ssl_certificate /root/ssl/<domain>.crt;
ssl_certificate_key /root/ssl/server.key;
server_name api.<domain>;
access_log /var/log/nginx/api.access.log;
error_log /var/log/nginx/api.error.log;
location ~ ^/([a-zA-Z]+)$ {
proxy_pass http://127.0.0.1:5000/$1;
}
}
有人知道为什么会这样吗?
谢谢!
更新 根据运行nscurl的@ Paulw11建议测试(下面)的结果,我决定尝试完全禁用App Transport Security。我将我的plist中的App Transport Security字典更改为:
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
我仍然得到同样的错误!因此,如果它不是App Transport Security,那么可能导致这种情况发生了什么?我再次犯的错误是:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
答案 0 :(得分:1)
我用来允许旧版本TLS(例如amazonaws)的密钥格式如下所示:
<key>NSIncludesSubdomains</key>
<string>NO</string>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<string>NO</string>
结构的其余部分看起来一样。有一次,我们在根级别有这个。
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.0</string>
答案 1 :(得分:1)
SSL / TLS握手中的server does not provide a complete certificate chain。虽然有些客户可以处理这个并建立信任链,但其他客户却不能。
您可以通过https://whatsmychaincert.com/?api.branon.co.uk找到缺少的中间证书,并在nginx的SSL配置中将其与您的网站证书一起提供。
请记住删除您可能已经实施的任何ATS例外情况!