Objective-C / Cocoa:我如何接受错误的服务器证书?

时间:2008-08-18 21:40:02

标签: objective-c cocoa networking

使用 NSURLRequest ,我正在尝试访问具有过期证书的网站。当我发送请求时,使用以下信息调用 connection:didFailWithError 委托方法:

-1203, NSURLErrorDomain, bad server certificate

我的搜索只提出了一个解决方案:NSURLRequest中隐藏的类方法:

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost];

但是,出于显而易见的原因,我不想在生产应用中使用私有API。

有关该怎么做的任何建议?我是否需要使用CFNetwork API,如果是,则需要两个问题:

  • 我可以使用哪些示例代码开始使用?我还没有在网上找到任何内容。
  • 如果我使用CFNetwork,我是否必须完全放弃NSURL?

编辑:

iPhone OS 3.0引入了支持这种方法。更多详情:How to use NSURLConnection to connect with SSL for an untrusted cert?

6 个答案:

答案 0 :(得分:8)

支持这种方式需要使用CFNetwork。您需要做的是将kCFStreamPropertySSLSettings附加到指定kCFStreamSSLValidatesCertificateChain == kCFBooleanFalse的流。下面是一些快速编写的代码,减去检查有效结果添加清理。完成此操作后,您可以使用CFReadStreamRead()来获取数据。

CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, CFSTR("http://www.apple.com"), NULL);
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, CFSTR("GET"), myURL, kCFHTTPVersion1_1);
CFReadStreamRef myStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest);
CFMutableDictionaryRef myDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(myDict, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse);
CFReadStreamSetProperty(myStream, kCFStreamPropertySSLSettings, myDict);    
CFReadStreamOpen(myStream);

答案 1 :(得分:3)

如果是内部服务器用于测试目的,为什么不将测试服务器的证书导入KeyChain并设置自定义信任设置?

答案 2 :(得分:2)

iPhone OS 3.0引入了支持这种方式,不需要低级CFNetwork API。更多细节在这里:

How to use NSURLConnection to connect with SSL for an untrusted cert?

答案 3 :(得分:1)

我遇到了同样的问题 - 我正在开发一个SOAP客户端,而开发服务器有一个“自行开发”的证书。我甚至无法使用该方法解决问题,因为我没有使用NSURL,而是(文档记录很少且显然已被遗弃)WS方法,并决定暂时(内部)使用非SSL连接。

然而,话虽如此,但是,如果您不愿意在生产应用中使用私有API,那么您是否应该允许访问具有狡猾证书的网站?

我引用Jens Alfke

  

这不仅仅是理论上的安全问题。东西
  据路透社报道,25%的公共DNS服务器受到了损害   最近的报告,甚至可以指导用户访问网络钓鱼/恶意软件/广告网站   如果他们正确输入域名。保护你的唯一事情   从那是SSL证书检查。

答案 4 :(得分:1)

您是否可以创建自签名证书并将自定义证书颁发机构添加到受信任的CA?我不太确定它在iPhone上是如何工作的,但我想在Mac OS X上你会把它们添加到钥匙串中。

您可能也对此帖Re: How to handle bad certificate error in NSURLDownload

感兴趣

答案 5 :(得分:0)

另一种选择是使用备用连接库。

我是AsyncSocket的忠实粉丝,它支持自签名证书

http://code.google.com/p/cocoaasyncsocket/

看一下,我认为它比标准的NSURLRequests更强大。