Objective-C报”NSURLErrorSecureConnectionFailed”异常的原因和解决办法

  • Post category:IOS

Objective-C中的”NSURLErrorSecureConnectionFailed”异常是指SSL握手失败,即https请求失败的错误。它可能是由于以下几个原因导致的:

  1. 服务端的SSL证书无效或过期;
  2. 客户端请求时没有提供正确的证书信息;
  3. 客户端和服务端之间存在网络问题,无法建立SSL连接。

要解决这个异常,我们可以采取以下几种方案:

  1. 确认SSL证书是否有效。如果证书无效或过期,应该及时更新。
  2. 配置正确的证书信息。客户端在进行https请求时,需要提供证书信息,确保其与服务端匹配。
  3. 检查网络连接是否正常。如果网络出现问题,则需要及时排查问题并修复。

接下来,我为你提供两条具体的示例:

示例一:检查证书有效性

NSString *urlString = @"https://www.example.com";
NSURL *url = [[NSURL alloc] initWithString:urlString];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
NSURLSession *session = [NSURLSession sharedSession];

NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                            completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (error) {
        if (error.code == NSURLErrorSecureConnectionFailed) {
            NSLog(@"SSL handshake failed.");
            NSLog(@"Error message:%@", error.localizedDescription);
            NSLog(@"Server SSL certificate:%@",[[[error userInfo] objectForKey:NSURLErrorFailingURLPeerTrustErrorKey] certificateAtIndex:0]);
        }
    } else {
        NSLog(@"https request succeeded.");
    }
}];

[dataTask resume];

在这个示例中,我们使用NSURLSession发起了一个https请求。如果遇到了”NSURLErrorSecureConnectionFailed”异常,我们会打印出错误信息和证书信息。通过打印出的证书信息,我们可以确定证书是否有效。

示例二:配置客户端证书信息

NSString *urlString = @"https://www.example.com";
NSURL *url = [[NSURL alloc] initWithString:urlString];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
NSURLSession *session = [NSURLSession sharedSession];

// 装载客户端证书
NSData *certData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"client" ofType:@"p12"]];
CFDataRef inPKCS12Data = (__bridge CFDataRef)certData;
SecIdentityRef identity;
SecTrustRef trust;
[NSURLCredential createIdentityAndTrustWithPKCS12Data:inPKCS12Data password:@"123456" identity:&identity trust:&trust];

// 配置NSURLSessionConfiguration
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.URLCredentialStorage = [NSURLCredentialStorage sharedCredentialStorage];
config.TLSMinimumSupportedProtocol = kTLSProtocol12;

// 创建NSURLSession,同时设置认证方式
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                            completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (error) {
        if (error.code == NSURLErrorSecureConnectionFailed) {
            NSLog(@"SSL handshake failed.");
            NSLog(@"Error message:%@", error.localizedDescription);
        }
    } else {
        NSLog(@"https request succeeded.");
    }
}];

[dataTask resume];

在这个示例中,我们不仅发起了一个https请求,还通过”createIdentityAndTrustWithPKCS12Data”方法加载了客户端证书,通过”sessionWithConfiguration”方法创建了会话,并且设置认证方式为”NSURLSessionDelegate”。这样一来,客户端就能够正确提供证书信息,从而避免了”NSURLErrorSecureConnectionFailed”异常。