ios - NSRequiresCertificateTransparency = YES 使 https 在 iOS 9 模拟器中失败

标签 ios ios-simulator ios9 app-transport-security nsapptransportsecurity

我正在尝试为我的 iOS 应用程序启用应用程序传输安全中的 NSRequiresCertificateTransparency 标志,以实现更好的安全性。我测试过,它在我的 iOS 10 设备和 iOS 10 模拟器中运行良好。但它使 https 连接在 iOS 9.3 模拟器中失败。如果我只是关闭这个特定的标志,它就会再次工作。

问题不在我连接的服务器中,因为即使使用 www.apple.com 我也能够重现它。以下是我使用的 Info.plist 中的设置:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.apple.com</key>
        <dict>
            <key>NSRequiresCertificateTransparency</key>
            <true/>
        </dict>
    </dict>
</dict>

这是代码:

NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com/"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (error) {
        NSLog(@"fail");
    }
}];
[task resume];

我在日志中看到的错误是: NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9802)

也许它只发生在 iOS 9 的模拟器中?不幸的是,我手头没有安装 iOS 9 的设备来测试它。

更新:

设置 CFNETWORK_DIAGNOSTICS=3 环境变量后,我在日志中没有看到任何有用的内容。这是有关错误的部分:

    Response Error
    Request: <CFURLRequest 0x7f8d0f668d00 [0x108314a40]> {url = https://www.apple.com/, cs = 0x0}
      Error: Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x7f8d0f590a80>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=<CFArray 0x7f8d0f50dfb0 [0x108314a40]>{type = immutable, count = 2, values = (
                0 : <cert(0x7f8d0f66ef10) s: www.apple.com i: Symantec Class 3 EV SSL CA - G3>
                1 : <cert(0x7f8d0f637e60) s: Symantec Class 3 EV SSL CA - G3 i: VeriSign Class 3 Public Primary Certification Authority - G5>
             )}}
    } [3:22]
Jan 31 17:09:13  test2[34612] <Notice>: CFNetwork Diagnostics [3:23] 17:09:13.125 {
               Did Fail
                 Loader: <CFURLRequest 0x7f8d0f737670 [0x108314a40]> {url = https://www.apple.com/, cs = 0x0}
                  Error: Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x7f8d0f590a80>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=<CFArray 0x7f8d0f50dfb0 [0x108314a40]>{type = immutable, count = 2, values = (
                            0 : <cert(0x7f8d0f66ef10) s: www.apple.com i: Symantec Class 3 EV SSL CA - G3>
                            1 : <cert(0x7f8d0f637e60) s: Symantec Class 3 EV SSL CA - G3 i: VeriSign Class 3 Public Primary Certification Authority - G5>
                         )}}
    init to origin load: 0.00299901s
             total time: 0.156503s
            total bytes: 0
    } [3:23]

更新2:

这是调试器中错误对象的 View 。

enter image description here

最佳答案

NSRequiresCertificateTransparency 键是在 iOS 10 中引入的,所以我不确定为什么会失败。它绝对不会因为证书透明度而失败,因为 iOS9 不会检查它,但 iOS 10 会检查(因为 iOS 10 理解 NSRequiresCertificateTransparency 键)。

我确实确认这在运行 iOS 9 的物理设备上会失败。但并非所有服务器都会失败。例如,www.google.com 可在模拟器和物理设备中运行于 iOS 9。

我建议打开 ATS 详细网络日志记录,以确定 SSL 故障是由您的 ATS 配置引起的还是其他原因造成的。查看如何打开详细日志记录的详细信息 here 。我怀疑还有另一个错误导致了 SSL 错误。

此外,从 info.plist 中删除所有与应用程序传输安全相关的条目,看看它是否在 iOS 9 中有效。至少消除根本原因的设置。

我唯一能想到的另一件事是,iOS9 因以下事实而感到困惑:您有一个异常域,下面没有有效的(就 iOS 9 而言)键,尽管我怀疑这就是它。也许在您的 apple.com 异常域条目下添加一个值为 false 的 NSAllowsArbitraryLoads 键。

我建议关闭该标志,直到您不再需要支持 iOS 9 设备。

关于ios - NSRequiresCertificateTransparency = YES 使 https 在 iOS 9 模拟器中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41915397/

相关文章:

IOS 检查手机语言的最佳和安全方法是什么?

uicollectionview - 拖动时防止通过其中心移动 UICollectionViewCell

php - 我真的需要专用 IP 地址来向 APNS 发送推送通知吗

ios - 超链接 + 单击 NSAttributedString 上的“点赞”按钮

objective-c - 如何在 iOS 中获取照片的原始文件名?

ios - 表格 View 中的 SWIFT 数据未显示

terminal - 如何从终端和 AppleScript 在模拟器中启动 iOS 应用程序

ios - 如何在 iOS 模拟器中模拟本地/推送通知?

xcode - iOS 模拟器上的控制中心空白 - 没有飞行模式按钮

ios - 为什么来自 CocoaPods 的 Acknowledgements.plist 在 iOS 9 上看起来乱七八糟,你能做些什么呢?