Objective-C中的”NSURLErrorSecureConnectionFailed”异常是指SSL握手失败,即https请求失败的错误。它可能是由于以下几个原因导致的:
- 服务端的SSL证书无效或过期;
- 客户端请求时没有提供正确的证书信息;
- 客户端和服务端之间存在网络问题,无法建立SSL连接。
要解决这个异常,我们可以采取以下几种方案:
- 确认SSL证书是否有效。如果证书无效或过期,应该及时更新。
- 配置正确的证书信息。客户端在进行https请求时,需要提供证书信息,确保其与服务端匹配。
- 检查网络连接是否正常。如果网络出现问题,则需要及时排查问题并修复。
接下来,我为你提供两条具体的示例:
示例一:检查证书有效性
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”异常。