菜鸟教程小白 发表于 2022-12-12 23:47:15

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


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

<p>问题不在我连接的服务器上,因为即使使用 www.apple.com 也能重现它。这是我使用的 Info.plist 中的设置:</p>

<pre><code>&lt;key&gt;NSAppTransportSecurity&lt;/key&gt;
&lt;dict&gt;
    &lt;key&gt;NSExceptionDomains&lt;/key&gt;
    &lt;dict&gt;
      &lt;key&gt;www.apple.com&lt;/key&gt;
      &lt;dict&gt;
            &lt;key&gt;NSRequiresCertificateTransparency&lt;/key&gt;
            &lt;true/&gt;
      &lt;/dict&gt;
    &lt;/dict&gt;
&lt;/dict&gt;
</code></pre>

<p>这里是代码:</p>

<pre><code>NSURLSessionDataTask *task = [ dataTaskWithURL: completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (error) {
      NSLog(@&#34;fail&#34;);
    }
}];
;
</code></pre>

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

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

<p><strong>更新:</strong></p>

<p>设置 CFNETWORK_DIAGNOSTICS=3 环境变量后,我在日志中看不到任何有用的信息。这是关于错误的部分:</p>

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

<p><strong>更新 2:</strong></p>

<p>这是调试器中错误对象的 View 。</p>

<p> <a href="/image/1eBXr.png" rel="noreferrer noopener nofollow"><img src="/image/1eBXr.png" alt="enter image description here"/></a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><code>NSRequiresCertificateTransparency</code> 键是在 iOS 10 中引入的,所以我不确定为什么会失败。它绝对不会因为证书透明度而失败,因为 iOS9 不会检查它,但 iOS 10 会(因为 iOS 10 理解 <code>NSRequiresCertificateTransparency</code> 键)。 </p>

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

<p>我建议打开 ATS 详细网络日志记录以确定 SSL 故障是由您的 ATS 配置引起的,还是其他原因引起的。查看有关如何打开详细日志记录的详细信息 <a href="https://stackoverflow.com/questions/40900357/app-transport-security-verbose/40942949#40942949" rel="noreferrer noopener nofollow">here</a> .我怀疑还有另一个错误导致 SSL 错误。 </p>

<p>另外,从 info.plist 中删除所有与 App Transport Security 相关的条目,看看它是否适用于 iOS 9。至少消除设置作为根本原因。 </p>

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

<p>我建议在您不再需要支持 iOS 9 设备之前关闭该标志。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - NSRequiresCertificateTransparency = YES 使 https 在 iOS 9 模拟器中失败,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/41915397/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/41915397/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - NSRequiresCertificateTransparency = YES 使 https 在 iOS 9 模拟器中失败