Objective-C/可可:如何接受错误的服务器证书?
-
08-06-2019 - |
题
使用 NSURL请求, ,我正在尝试访问证书已过期的网站。当我发送请求时,我的 连接:didFailWithError 使用以下信息调用委托方法:
-1203, NSURLErrorDomain, bad server certificate
我的搜索只找到了一种解决方案:NSURLRequest 中的隐藏类方法:
[NSURLRequest setAllowsAnyHTTPSCertificate:YES forHost:myHost];
但是,出于显而易见的原因,我不想在生产应用程序中使用私有 API。
有什么建议吗?我是否需要使用 CFNetwork API?如果需要,有两个问题:
- 我可以使用任何示例代码来开始使用吗?我网上没找到。
- 如果我为此使用 CFNetwork,我是否必须完全放弃 NSURL?
编辑:
iPhone OS 3.0 引入了一种受支持的方法来执行此操作。更多详细信息请参见此处: 如何使用 NSURLConnection 与 SSL 连接以获得不受信任的证书?
解决方案 3
iPhone OS 3.0 引入了一种受支持的方法来执行此操作,不需要较低级别的 CFNetwork API。更多详细信息请参见此处:
其他提示
支持的方法需要使用 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);
如果是用于内部服务器进行测试,为什么不将测试服务器的证书导入到 KeyChain 中并设置自定义信任设置呢?
我遇到了同样的问题 - 我正在开发 SOAP 客户端,并且开发服务器有一个“自制”证书。即使使用该方法,我也无法解决问题,因为我没有使用 NSURL,而是使用(文档记录不足且显然已废弃的)WS 方法,并决定暂时(在内部)仅使用非 SSL联系。
然而,话虽如此,我想到的问题是,如果您不愿意在生产应用程序中使用私有 API,您是否应该允许访问具有可疑证书的网站?
我会引用 延斯·阿尔夫克:
这不仅仅是一个理论上的安全问题。某物
据统计,大约 25% 的公共 DNS 服务器已遭到破坏
最近的报告,甚至可以将用户引导至网络钓鱼/恶意软件/广告网站
如果他们正确输入域名。唯一能保护你的
其中就是 SSL 证书检查。
您可以创建自签名证书并将自定义证书颁发机构添加到受信任的 CA 中吗?我不太确定这在 iPhone 上如何工作,但我假设在 Mac OS X 上您会将这些添加到钥匙串中。
您可能也对这篇文章感兴趣 关于:如何处理 NSURLDownload 中的错误证书错误
另一种选择是使用备用连接库。
我是 AsyncSocket 的忠实粉丝,它支持自签名证书
http://code.google.com/p/cocoaasyncsocket/
看一下,我认为它比标准 NSURLRequests 更强大。