允许任意加载在 iOS 9.1 模拟器中不起作用

Allow Arbitrary Loads does not work in iOS 9.1 Simulator

尝试在我本地计算机上的 VirtualBox VM 上建立到服务器的 NSURLConnection。服务器是一个带有自签名 RSA 2048 位证书的测试环境。

Apache SSL 是这样配置的:

SSLProtocol ALL -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
SSLCompression off
SSLSessionCache         shmcb:/var/cache/mod_ssl/scache(512000)
SSLSessionCacheTimeout  300
<VirtualHost *:443>
    ServerName mydomain.com
    DocumentRoot "/var/www/html/example/Web"
    SSLEngine On
    SSLOptions +StrictRequire
    SSLCertificateFile /etc/ssl/certs/server.crt
    SSLCertificateKeyFile /etc/ssl/private/server.key
</VirtualHost>

Wireshark 显示客户端 hello 和服务器 hello 发生得很好。但是我们在 /usr/bin/nscurl --ats-diagnostics https://example.com --verbose 中看到客户端应用程序拒绝服务器的证书,因为它无效(它是自签名的;我知道它无效)。

据说您可以将 "Allow Arbitrary Loads" 添加到 Info.plist 以在 iOS 9 中禁用 ATS,但我这样做了,但它什么也没做。客户仍然拒绝自签名证书。

有什么办法可以让这项工作成功吗?我想这可能是 iOS 模拟器特有的问题?

允许任意加载仅覆盖以下内容:

  • 禁止 HTTP 请求
  • HTTPS 的密钥长度和加密类型要求

它对自签名证书没有影响。要了解如何使用自签名证书,请阅读 Apple 开发者网站上的 Overriding SSL Chain Validation Correctly。基本上,您实现了一个自定义身份验证质询处理程序,如果保护 space 的身份验证方法不是 "server trust",则告诉 URL 加载系统执行默认处理。否则,要么:

一个。检查证书的 public 密钥以确保它是您的,或者

乙。修改信任对象,评估如下:

  1. 在您的应用中提供证书副本。
  2. 加载证书。
  3. 将其添加为信任对象中的锚点
  4. 评估信任对象,

A​​pple 文档提供了应该有所帮助的详细示例。