我正在开发一个使用 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-推荐答案 strong>
经过大量研究,我向 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/
|