iOS 11 ATS(App Transport Security)不再接受自定义锚证书?

Way*_*yne 38 security ssl ios11 xcode9

我使用"NSMutableURLRequest"租用自签名证书,当使用带有"SecTrustSetAnchorCertificates"的自定义证书锚定证书时,iOS 11失败并显示以下错误消息:

refreshPreferences: HangTracerEnabled: 1
refreshPreferences: HangTracerDuration: 500
refreshPreferences: ActivationLoggingEnabled: 0 ActivationLoggingTaskedOffByDA:0
ATS failed system trust
System Trust failed for [1:0x1c417dc40]
TIC SSL Trust Error [1:0x1c417dc40]: 3:0
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
Task <721D712D-FDBD-4F52-8C9F-EEEA28104E73>.<1> HTTP load failed (error code: -1200 [3:-9802])
Task <721D712D-FDBD-4F52-8C9F-EEEA28104E73>.<1> finished with error - code: -1200
Run Code Online (Sandbox Code Playgroud)

以前适用于iOS 10的内容在IO 11中不再有效.

我知道iOS 11不再支持以下内容:

  • RC4 3DES-CBC AES-CBC
  • MD5 SHA-1
  • <2048位RSA发布密钥 - 与服务器的所有TLS连接
  • HTTP://
  • 在SSLv3
  • TLS 1.0
  • TLS 1.1

除了一个SHA-1指纹外,证书不使用这些,但也列出了SHA-256指纹.

通过添加以下内容,我们可以绕过ATS(App Transport Security)错误:

<key>NSAppTransportSecurity</key>
<dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>mydomain.com</key>
            <dict>
                <!--Include to allow subdomains-->
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
            </dict>
        </dict>
</dict>
Run Code Online (Sandbox Code Playgroud)

通过将根/锚证书安装到手机本身也可以在不需要将mydomain.com列入白名单的情况下工作.

这是否意味着ATS不再支持自签名证书?

这曾经在iOS 10中工作:

SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)certs);
Run Code Online (Sandbox Code Playgroud)

使用NSMutableURLRequest在Mac上显示许多故障和安装根证书进入"系统"后密钥库SecTrustSetAnchorCertificates成功.这是在macOS 10.12.6上完成的.

nscurl --verbose --ats-diagnostics https://
Run Code Online (Sandbox Code Playgroud)

如何使用自定义证书进行此工作,但无需安装证书或将域列入白名单?

小智 3

不久前,macOS 开始强制要求 CA 证书不能同时用作终端实体(例如 Web 服务器)证书。有没有可能iOS在10到11之间添加了这个要求?

如果是这样,解决方法很简单:创建自签名 CA 证书,并使用该证书颁发 Web 服务器证书。CA 证书(basicConstraints:CA=True)是您的信任存储中的信任锚;终端实体证书(省略 basicConstraints;extendedKeyUsage=serverAuth)由 Web 服务器提供。只是不允许您再对两者使用完全相同的证书。

(这应该是一条评论,但我还没有足够的点来评论。)