菜鸟教程小白 发表于 2022-12-12 14:58:06

ios - SSL - 在 iOS7 中表现不同?


                                            <p><p>我正在开发一个使用 https 与服务器通信的 iOS Enterprise POS 应用程序。我看过 <a href="https://stackoverflow.com/questions/18756241/receiving-ssl-error-in-ios7-gm-addtrust-external-ca-root-is-not-trusted" rel="noreferrer noopener nofollow">Receiving SSL error in iOS7 GM - &#34;AddTrust External CA Root&#34; is not trusted?</a>和 <a href="https://stackoverflow.com/questions/4024393/difference-between-self-signed-ca-and-self-signed-certificate" rel="noreferrer noopener nofollow">Difference between self-signed CA and self-signed certificate</a>并且通常在网上搜索,但我没有得到任何地方。</p>

<p>该应用程序在 iOS6.1 上使用 http 或 https 协议(protocol)运行良好。它也可以通过 http 在 iOS 7GM 上正常工作,但不能通过 https - 它在发送到服务器的第一条消息时失败。在应用程序方面,我处理身份验证挑战:</p>

<pre><code>- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge
{
   
         forAuthenticationChallenge:challenge];
}
</code></pre>

<p>之后我收到一个回调:</p>

<pre><code>- (void)connectionDidFinishLoading:(NSURLConnection *)connection
</code></pre>

<p>不是:</p>

<pre><code>- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
</code></pre>

<p>我相信这意味着客户端和服务器成功协商连接,同意加密协议(protocol)等。不幸的是,虽然返回似乎成功(就网络堆栈而言),但我在AMF 有效载荷。</p>

<p>这是有趣的部分 - 在服务器端 (JBoss4.2.3) 我可以断点并检查包含 AMFRequest 的 httpRequest 正文。通过 http,我总是在正文中获得 384 个字节。通过 https,如果客户端是 iOS 6.1,我会得到 384 个字节,但如果客户端是 iOS 7,我会得到 0 个字节。我认为这是因为服务器“正常”接受了 https 请求,没有错误、安全违规等。</p>

<p>还有一个数据点。如果我在客户端运行 <em>Charles</em>,一切都可以使用 iOS 7 模拟器在 https 上正常运行。我可以在 Charles 和服务器上看到我的 384 字节 AMFRequest。 Charles 作为 http 代理工作 - 但应用程序对此一无所知,那么为什么插入 Charles 作为中介使其工作?我已经安装了 Charles 的证书,所以我认为它通过 SSL 与服务器通信(不确定)。</p>

<p>感谢您的任何帮助或建议。</p>

<p>更新:我实现了 Apple 推荐的方法:</p>

<pre><code>- (void)connection: (NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    traceMethod();
    SecTrustRef trust = challenge.protectionSpace.serverTrust;
    NSURLCredential *credential = ;
    [challenge.sender useCredential: credential
         forAuthenticationChallenge: challenge];
}
</code></pre>

<p>但它得到的结果与旧的(iOS 5 之前的)方法完全相同。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>经过大量研究,我向 Apple 开发者技术支持发起了一个事件,最终得到了解释。</p>

<p>我已经能够确认 Apple 在 iOS 7 中进行了更改,作为“针对 BEAST 攻击的推荐对策”,这是针对 SSL TLS 协议(protocol)的“中间人”攻击 - 请参阅此 <a href="http://www.kb.cert.org/vuls/id/864643" rel="noreferrer noopener nofollow">article on CERT</a> .</p>

<p>理想的解决方案是更改要使用的 JBoss (Tomcat) ssl 连接器:</p>

<pre><code>sslProtocol=&#34;TLSv1.2&#34;
</code></pre>

<p>不幸的是,现有的 JBoss4.2.3GA 实现无法处理 TLSv1.1 或 TLSv1.2,或处理使用此对策的消息。看来唯一的解决方案是升级 JBoss 配置。这需要对 JBoss 进行重大更改 - 参见 <a href="https://community.jboss.org/thread/155869?start=0&amp;tstart=0" rel="noreferrer noopener nofollow">JBoss article</a> . </p>

<p>另一种方法是重写网络方法以使用较低级别的框架(CFSocketStream 而不是 NSURLConnection)并禁用 BEAST 对策。这有两个缺点 - 它重新暴露了安全漏洞,并且它是一个需要彻底测试(尤其是模拟网络边缘情况)的重要实现。</p>

<p>在我的情况下,假期之前的时间不允许发生如此大的变化。我的客户是一家大型零售商,他们的 IT 部门在 10 月中旬锁定了环境。</p>

<p>也许这些信息会对其他人有所帮助。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - SSL - 在 iOS7 中表现不同?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/19034609/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/19034609/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - SSL - 在 iOS7 中表现不同?