iOS App Transport Security 不接受 TLSv1.2 连接和 plist 异常没有任何区别
iOS App Transport Security not accepting TLSv1.2 connection and plist exceptions not making any difference
我有一个 iOS 应用程序,它使用 SSL/HTTPS 与服务器通信。服务器提供的证书适用于 TLSv1.2(App Transport Security 的主要要求)。 URL 的示例(可以通过检查证书验证 TLSv1.2)是 https://api.branon.co.uk/checkOnline.
但是,该应用程序会抛出与应用程序传输层相关的错误 - 这些错误在 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/;
}
}
有人知道为什么会这样吗?
谢谢!
更新:
根据 @Paulw11 建议的测试(下方)运行 nscurl 的结果,我决定尝试完全禁用 App Transport Security。我将 plist 中的 App Transport Security 字典更改为以下内容:
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
我仍然遇到同样的错误!那么,如果不是 App Transport Security,可能是什么原因造成的?我再次遇到的错误是:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
我用来允许旧版本 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>
server does not provide a complete certificate chain 在其 SSL/TLS 握手中。虽然一些客户可以处理这个问题并建立信任链,但其他客户不能。
您可以通过 https://whatsmychaincert.com/?api.branon.co.uk 找到丢失的中间证书,并在 nginx 的 SSL 配置中将其与您站点的证书一起提供。
请记住删除您可能已设置的任何 ATS 例外!
我有一个 iOS 应用程序,它使用 SSL/HTTPS 与服务器通信。服务器提供的证书适用于 TLSv1.2(App Transport Security 的主要要求)。 URL 的示例(可以通过检查证书验证 TLSv1.2)是 https://api.branon.co.uk/checkOnline.
但是,该应用程序会抛出与应用程序传输层相关的错误 - 这些错误在 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/;
}
}
有人知道为什么会这样吗?
谢谢!
更新: 根据 @Paulw11 建议的测试(下方)运行 nscurl 的结果,我决定尝试完全禁用 App Transport Security。我将 plist 中的 App Transport Security 字典更改为以下内容:
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
我仍然遇到同样的错误!那么,如果不是 App Transport Security,可能是什么原因造成的?我再次遇到的错误是:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
我用来允许旧版本 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>
server does not provide a complete certificate chain 在其 SSL/TLS 握手中。虽然一些客户可以处理这个问题并建立信任链,但其他客户不能。
您可以通过 https://whatsmychaincert.com/?api.branon.co.uk 找到丢失的中间证书,并在 nginx 的 SSL 配置中将其与您站点的证书一起提供。
请记住删除您可能已设置的任何 ATS 例外!