2008-08-18 65 views
8

使用NSURLRequest,我试图访问一个有过期证书的网站。当我发送请求,我连接:didFailWithError委托方法被调用,有下列信息:Objective-C/Cocoa:如何接受错误的服务器证书?

-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?

回答

1

我碰到了同样的问题 - 我正在开发一个SOAP客户端,并且开发服务器有一个“本土”证书。即使使用这种方法,我也无法解决这个问题,因为我没有使用NSURL,而是(文档记录不佳并且显然已被废弃)的WS方法,并决定暂时(内部)仅使用非SSL连接。

但是,话虽如此,但如果您不愿意在生产应用程序中使用私有API,您是否应该允许访问带有恶意证书的网站?

我还要举Jens Alfke

这不仅仅是理论上的安全问题。根据
最近的报告,25%的公共DNS服务器已经被入侵,并且如果他们正确输入域名,可以将用户引导至网络钓鱼/恶意软件/广告网站,甚至
。唯一保护你
从那是SSL证书检查。

+0

有问题的网站是在我们的测试环境中,只有访问内部。我想网络管理员太便宜或者懒得维护它的有效证书。当然,我们的生产环境拥有有效的证书。由于这种证书隐藏功能在生产中不会启用或需要,我可以使用专用API来进行测试。我仍然希望以“正确”的方式来做,因为如果私有API被抽出,我会回到原点。 – 2008-08-19 16:17:34

1

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

您还可能有兴趣在这个岗位Re: How to handle bad certificate error in NSURLDownload

3

如果它是用于测试目的的内部服​​务器,为什么不直接导入测试服务器的证书到钥匙链,并设置自定信任设置?

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); 
0

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

我AsyncSocket一个巨大的风扇,它具有自签名的证书

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

看看的支持,我认为这是方式更强大的那么标准NSURLRequests。

相关问题