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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在iOS中检查SSL证书的安全性?相关的知识,希望对你有一定的参考价值。

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

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

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

我该如何实现?

答案

ios不能为您提供非常细致的证书信息访问。您有两种选择:专用API或使用OpenSSL构建自己的评估程序。

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

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

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

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

- (void)connection:(NSURLConnection *)connection
  willSendRequestForAuthenticationChallenge:
  (NSURLAuthenticationChallenge *)challenge
{
  NSURLProtectionSpace *protSpace = challenge.protectionSpace;
  SecTrustRef trust = protSpace.serverTrust;
  ...
    SecCertificateRef cert = SecTrustGetCertificateAtIndex(trust, 0);
  ...

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

另一答案

NSURLSessionConfiguration * sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];self.urlSession = [NSURLSession sessionWithConfiguration:sessionConfig委托:self RepresentativeQueue:nil];

[[[self.urlSession dataTaskWithURL:[NSURL URLWithString:self.textField.text]完成处理程序:^(NSData * _Nullable数据,NSURLResponse * _Nullable响应,NSError * _Nullable错误){//响应管理代码}]简历];

-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)挑战完成处理器:(void(^)(NSURLSessionAuthChallengeDisposition,NSURLCredential * _Nullable))completionHandler {

// Get remote certificate
SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, 0);

// Set SSL policies for domain name check
NSMutableArray *policies = [NSMutableArray array];
[policies addObject:(__bridge_transfer id)SecPolicyCreateSSL(true, (__bridge CFStringRef)challenge.protectionSpace.host)];
SecTrustSetPolicies(serverTrust, (__bridge CFArrayRef)policies);

// Evaluate server certificate
SecTrustResultType result;
SecTrustEvaluate(serverTrust, &result);
BOOL certificateIsValid = (result == kSecTrustResultUnspecified || result == kSecTrustResultProceed);

// Get local and remote cert data
NSData *remoteCertificateData = CFBridgingRelease(SecCertificateCopyData(certificate));
NSString *pathToCert = [[NSBundle mainBundle]pathForResource:@"github.com" ofType:@"cer"];
NSData *localCertificate = [NSData dataWithContentsOfFile:pathToCert];

// The pinnning check
if ([remoteCertificateData isEqualToData:localCertificate] && certificateIsValid) {
    NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust];
    completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
} else {
    completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, NULL);
}

}

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

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

如何检查SSL证书安装正确

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

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

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

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