我正在开发一个使用 https 与服务器通信的 iOS Enterprise POS 应用程序。我查看了在 iOS7 GM 中接收 SSL 错误 - “AddTrust External CA Root”不受信任?和自签名 CA 和自签名证书之间的区别,通常在网上搜索,但我没有得到任何结果。
该应用程序使用 http 或 https 协议在 iOS6.1 上运行良好。它也可以通过 http 在 iOS 7GM 上正常工作,但不能通过 https - 它在发送到服务器的第一条消息时失败。在应用程序方面,我处理身份验证挑战:
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *)challenge
{
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]
forAuthenticationChallenge:challenge];
}
之后我收到一个回调:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
不是:
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
我相信这意味着客户端和服务器成功协商了连接,就加密协议达成一致等。不幸的是,尽管返回似乎成功(就网络堆栈而言),但我在 AMF 有效负载中返回了 0 个字节的数据。
这是有趣的部分 - 在服务器端 (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 willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
traceMethod();
SecTrustRef trust = challenge.protectionSpace.serverTrust;
NSURLCredential *credential = [NSURLCredential credentialForTrust: trust];
[challenge.sender useCredential: credential
forAuthenticationChallenge: challenge];
}
但它得到的结果与旧的(iOS 5 之前的)方式完全相同。