OStack程序员社区-中国程序员成长平台

标题: ios - SSL - 在 iOS7 中表现不同? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 14:58
标题: ios - SSL - 在 iOS7 中表现不同?

我正在开发一个使用 https 与服务器通信的 iOS Enterprise POS 应用程序。我看过 Receiving SSL error in iOS7 GM - "AddTrust External CA Root" is not trusted?Difference between self-signed CA and self-signed certificate并且通常在网上搜索,但我没有得到任何地方。

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

- (void)connectionNSURLConnection *)connection didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge 
{
    [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] 
         forAuthenticationChallenge:challenge];
}

之后我收到一个回调:

- (void)connectionDidFinishLoadingNSURLConnection *)connection

不是:

- (void)connectionNSURLConnection *)connection didFailWithErrorNSError *)error

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

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

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

感谢您的任何帮助或建议。

更新:我实现了 Apple 推荐的方法:

- (void)connection: (NSURLConnection *)connection willSendRequestForAuthenticationChallengeNSURLAuthenticationChallenge *)challenge
{
    traceMethod();
    SecTrustRef trust = challenge.protectionSpace.serverTrust;
    NSURLCredential *credential = [NSURLCredential credentialForTrust: trust];
    [challenge.sender useCredential: credential
         forAuthenticationChallenge: challenge];
}

但它得到的结果与旧的(iOS 5 之前的)方法完全相同。



Best Answer-推荐答案


经过大量研究,我向 Apple 开发者技术支持发起了一个事件,最终得到了解释。

我已经能够确认 Apple 在 iOS 7 中进行了更改,作为“针对 BEAST 攻击的推荐对策”,这是针对 SSL TLS 协议(protocol)的“中间人”攻击 - 请参阅此 article on CERT .

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

sslProtocol="TLSv1.2"

不幸的是,现有的 JBoss4.2.3GA 实现无法处理 TLSv1.1 或 TLSv1.2,或处理使用此对策的消息。看来唯一的解决方案是升级 JBoss 配置。这需要对 JBoss 进行重大更改 - 参见 JBoss article .

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

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

也许这些信息会对其他人有所帮助。

关于ios - SSL - 在 iOS7 中表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19034609/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4