11

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

-1203, NSURLErrorDomain, bad server certificate

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

[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost];

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

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

  • 我可以使用任何示例代码开始使用吗?我没有在网上找到任何东西。
  • 如果我为此使用 CFNetwork,我是否必须完全放弃 NSURL?

编辑:

iPhone OS 3.0 引入了一种支持的方法来执行此操作。此处有更多详细信息:如何使用 NSURLConnection 与 SSL 连接以获得不受信任的证书?

4

6 回答 6

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);
于 2008-10-29T05:37:43.823 回答
3

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

于 2008-10-18T20:22:44.903 回答
2

iPhone OS 3.0 引入了一种支持的方式来执行此操作,它不需要较低级别的 CFNetwork API。更多细节在这里:

如何使用 NSURLConnection 与 SSL 连接以获得不受信任的证书?

于 2010-02-03T21:05:10.617 回答
1

我遇到了同样的问题——我正在开发一个 SOAP 客户端,而开发服务器有一个“本土”证书。即使使用该方法,我也无法解决问题,因为我没有使用 NSURL,但是(记录不充分且显然已放弃)WS 方法,并暂时决定(内部)仅使用非 SSL联系。

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

我会引用Jens Alfke 的话:

这不仅仅是一个理论上的安全问题。
根据最近的报告,大约 25% 的公共 DNS 服务器已被入侵,即使用户 正确输入了域名
,也可以将用户引导至网络钓鱼/恶意软件/广告网站。
唯一能保护您
免受这种影响的是 SSL 证书检查。

于 2008-08-19T10:41:42.827 回答
1

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

您可能也对这篇文章感兴趣Re: How to handle bad certificate error in NSURLDownload

于 2008-08-21T16:42:46.350 回答
0

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

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

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

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

于 2008-11-21T19:06:41.207 回答