SSL固定和AFNetworking 2.5.0的问题(NSURLErrorDomain错误-1012.)

dav*_*hab 33 ssl ios afnetworking afnetworking-2

使用AFNetworking 2.5.0,我们一直很难通过SSL保护应用程序的网络连接.

我们使用自签名证书颁发机构,并使用固定证书实施自定义安全策略.

我们已经测试了AFNetworking提供的很多配置,但到目前为止还不幸运.我们收到的错误消息是:

2015-01-05 19:03:07.191 AppName [9301:319051]更新用户旅程时出错.错误:错误域= NSURLErrorDomain代码= -1012"操作无法完成.(NSURLErrorDomain错误-1012.)"UserInfo = 0x7ae056b0 {NSErrorFailingURLKey = https://api.XXX.com/XXX/XXX/,NSErrorFailingURLStringKey = https://api.XXX.com/XXX/XXX/ }

我们的证书适用于其他客户端,如cURL和Android.使用HTTP时,我们的实现也非常好.

是否有人知道与固定证书和AFNetworking相关的任何问题?如果是的话,我们非常感谢您提供的任何指示.

以下是实施的一部分:

+ (AFSecurityPolicy*)customSecurityPolicy {
   AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
   NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"der"];
   NSData *certData = [NSData dataWithContentsOfFile:cerPath];
   [securityPolicy setAllowInvalidCertificates:NO];
   [securityPolicy setValidatesCertificateChain:NO];
   [securityPolicy setPinnedCertificates:@[certData]];
   return securityPolicy;
}

+ (AFHTTPRequestOperationManager*)customHttpRequestOperationManager {
   AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
   manager.securityPolicy = [self customSecurityPolicy]; // SSL
   return manager;
}

+(void)getRequestWithUrl:(NSString*)url success:(void(^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void(^) (AFHTTPRequestOperation *operation, NSError *error))failure {
   [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
   AFHTTPRequestOperationManager *manager = [HttpClient customHttpRequestOperationManager];
   manager.responseSerializer = [AFHTTPResponseSerializer serializer];
   [manager GET:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
       [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
       success(operation, responseObject);
   } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
       [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
       failure(operation, error);
   }];
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Jor*_*ndo 46

阅读AFNetworking代码并查看更改日志后,我必须做些什么才能使其正常工作.

使用AFSSLPinningModeCertificate创建AFSecurityPolicy对象:

AFSecurityPolicy* policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
Run Code Online (Sandbox Code Playgroud)

默认情况下,AFNetworking将验证证书的域名.我们的证书是基于每个服务器生成的,并非所有证书都有域名,因此我们需要禁用它:

[policy setValidatesDomainName:NO];
Run Code Online (Sandbox Code Playgroud)

由于证书是自签名的,因此它们在技术上是"无效的",因此我们也需要允许它:

[policy setAllowInvalidCertificates:YES];
Run Code Online (Sandbox Code Playgroud)

最后,AFNetworking将尝试在证书链上一直验证证书,这对我来说似乎只会上链到我们的CA,但无论出于什么原因它都没有,所以我们也必须禁用它:

[policy setValidatesCertificateChain:NO];
Run Code Online (Sandbox Code Playgroud)

就是这样!在您的请求管理器中设置安全策略就像您已经在做的那样,它应该可以正常工作.

那么,回顾一下,您发布的代码中真正需要更改的是:

A)正如David Caunt所提到的,将您的固定模式从更改AFSSLPinningModeNoneAFSSLPinningModeCertificate

B)添加行以禁用验证域名: [policy setValidatesDomainName:NO]

另外一点,AFNetworking现在会自动检查你的软件包中的.cer文件,所以如果你要将你的证书重命名为.cer扩展名,你可以删除代码以从软件包中取出证书数据并设置固定证书.

  • 如果您通过Cocoapods使用动态框架(use_frameworks!).自动检测.cer文件可能不起作用.您可以切换到使用桥接头将AFNetworking集成到一个快速项目中,该项目为我解决了这个问题.我怀疑这是lib的不同位置,如果它是动态框架的话. (4认同)
  • 您应该将此标记为已接受的答案.当我有一个NSURLErrorDomain代码= -999"取消"时,为我工作.节省了我很多时间,谢谢! (2认同)

Eve*_*eng 24

因为你有经理初始化,你可以这样做:

manager.securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy.validatesDomainName = NO;
Run Code Online (Sandbox Code Playgroud)

它适用于自签名证书


tha*_*rem 5

我收到了这个错误, Error Domain=NSURLErrorDomain Code=-1012 NSErrorFailingURLStringKey

以下的变化让它对我有用.

self.validatesDomainName = NO;
Run Code Online (Sandbox Code Playgroud)