如何使用NSURLConnection与SSL进行不可信的证书连接?
我有以下简单的代码来连接到SSL网页
NSMutableURLRequest *urlRequest=[NSMutableURLRequest requestWithURL:url];
[ NSURLConnection sendSynchronousRequest: urlRequest returningResponse: nil error: &error ];
除非证书是自签名的证书,否则会给出错误。 Error Domain=NSURLErrorDomain Code=-1202 UserInfo=0xd29930 "untrusted server certificate".
有没有办法将它设置为无论如何接受连接(就像在浏览器中,你可以按接受)或者绕过它的方式?
有一个支持的API来完成这个! 把这样的东西添加到你的NSURLConnection
委托中:
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
if ([trustedHosts containsObject:challenge.protectionSpace.host])
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
请注意, connection:didReceiveAuthenticationChallenge:
可以稍后将其消息发送到challenge.sender(很多),在必要时向用户提供对话框之后等等。
如果您不愿意(或无法)使用私有API,则有一个名为ASIHTTPRequest的开放源代码(BSD许可证)库,它提供了低层CFNetwork APIs
的封装。 他们最近引入了使用自签名或不可信证书与-setValidatesSecureCertificate:
API来允许HTTPS connections
功能。 如果你不想拉入整个图书馆,你可以使用源代码作为自己实现相同功能的参考。
理想情况下,当iOS应用程序需要接受不可信证书时,应该只有两种情况。
方案A:您已连接到使用自签名证书的测试环境。
方案B:您使用MITM Proxy like Burp Suite, Fiddler, OWASP ZAP, etc.
来代理HTTPS
流量MITM Proxy like Burp Suite, Fiddler, OWASP ZAP, etc.
代理将返回由自签名CA签名的证书,以便代理能够捕获HTTPS
流量。
生产主机不应该使用不受信任的证书,原因很明显。
如果您需要让iOS模拟器接受用于测试目的的不可信证书,强烈建议您不要更改应用程序逻辑,以禁用由NSURLConnection
API提供的内置证书验证。 如果应用程序在不删除该逻辑的情况下向公众发布,则它将容易受到中间人攻击。
为测试目的而接受不可信证书的推荐方法是将签名证书的证书颁发机构(CA)证书导入您的iOS模拟器或iOS设备。 我写了一篇快速博客文章,演示了如何在iOS模拟器上执行此操作:
使用ios模拟器接受不受信任的证书
链接地址: http://www.djcxy.com/p/31279.html上一篇: How to use NSURLConnection to connect with SSL for an untrusted cert?