如何在 iOS 中检查 SSL 证书的安全性?

Posted

技术标签:

【中文标题】如何在 iOS 中检查 SSL 证书的安全性?【英文标题】:How to check the security of the SSL certificate in iOS? 【发布时间】:2012-03-13 20:01:27 【问题描述】:

我想检查 URL 中是否存在 SSL 证书,还想检查其版本和验证类型。

我创建了一个应用程序,我在其中调用 NSURLConnection 委托方法以通过服务器发送请求。

也使用了 "canAuthenticateAgainstProtectionSpace" 方法,但是一旦建立连接就不会调用此方法。

我如何做到这一点?

【问题讨论】:

【参考方案1】:

ios 无法让您对证书信息进行非常精细的访问。您有两个选择:私有 API 或使用 OpenSSL 构建您自己的评估器。

您可以在opensource code 中看到私有证书功能。该版本可从SecCertificateVersion() 获得。我不确定您所说的“验证类型”是什么意思。

要使用 OpenSSL 执行此操作,您可以使用 SecCertificateCopyData() 获取 DER 数据,然后自己解析所有内容。

我建议就这个问题打开一个雷达 (bugreporter.apple.com)。无法访问有关证书的基本信息是一个严重的问题。

如果您正在寻找从NSURLConnection 中提取证书的示例代码,请参阅iOS:PTL 中的Chapter 11 sample code:

- (void)connection:(NSURLConnection *)connection
  willSendRequestForAuthenticationChallenge:
  (NSURLAuthenticationChallenge *)challenge

  NSURLProtectionSpace *protSpace = challenge.protectionSpace;
  SecTrustRef trust = protSpace.serverTrust;
  ...
    SecCertificateRef cert = SecTrustGetCertificateAtIndex(trust, 0);
  ...

此时,cert 持有您的叶子证书。

【讨论】:

感谢您的建议。“验证类型”是指在 URL 上实施的 SSL 验证类型,标准或扩展验证。在这里,我使用了“第 11 章示例代码”中给出的代码,但是当我尝试构建应用程序时,出现编译时错误 -> 架构 i386 的未定义符号:“_SecPolicyCreateBasicX509”,引用自:ConnectionViewController 中的 _RNSecTrustEvaluateAsX509。 o,“_SecCertificateNotValidAfter”,引用自:-[ConnectionViewController connection:willSendRequestForAuthenticationChallenge:] in ConnectionViewController.o

以上是关于如何在 iOS 中检查 SSL 证书的安全性?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查网站SSL证书有没有到期?

如何检查SSL证书安装正确

中科三方:浏览器是如何检查SSL证书正常工作的?

如何在 xmpp IOS 中使用 SSL 证书?

如何使用 Ionic Cordova 框架和自签名证书绕过 iOS 11 中的 SSL 检查

如何使用urllib2.urlopen检查(不绕过)SSL证书?