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

我们一直在使用AFNetworking 2.5.0来确保我们的应用程序使用SSL的networking连接。

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

我们已经testing了不less由AFNetworking提供的configuration,但到目前为止还没有幸运。 我们收到的错误消息是:

2015-01-05 19:03:07.191 AppName [9301:319051]更新用户旅程时出错。 (NSURLErrorDomain error -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); }]; } 

谢谢!

读完AFNetworking代码并检查更改日志后,我需要做些什么才能使其工作。

使用AFSSLPinningModeCertificate创build您的AFSecurityPolicy对象:

 AFSecurityPolicy* policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; 

默认情况下,AFNetworking将validation证书的域名。 我们的证书是以每台服务器为基础生成的,并不是所有的证书都有域名,所以我们需要禁用:

 [policy setValidatesDomainName:NO]; 

由于证书是自签名的,所以在技术上是“无效的”,所以我们也需要允许:

 [policy setAllowInvalidCertificates:YES]; 

最后,AFNetworking将尝试validation证书链上的证书,对我来说,这似乎只会连接到我们的CA,但无论出于什么原因,我们也必须禁用:

 [policy setValidatesCertificateChain:NO]; 

而就是这样! 在你的请求pipe理器中设置安全策略就像你已经在做,它应该工作正常。

所以,回顾一下,你真正需要在你发布的代码中进行更改的是:

A)正如David Caunt所说,将您的固定模式从AFSSLPinningModeNoneAFSSLPinningModeCertificate

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

另外需要注意的是,AFNetworking现在会自动检查您的.cer文件包,因此如果要将您的证书重命名为扩展名为.cer,则可以取消代码以从证书中获取证书数据并设置固定的证书。

既然你有经理初始化,你可以这样做:

 manager.securityPolicy.allowInvalidCertificates = YES; manager.securityPolicy.validatesDomainName = NO; 

它将用于自签名证书

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

下面的改变让我为自己工作。

 self.validatesDomainName = NO; 

您正在使用SSLPinningMode模式AFSSLPinningModeNone创buildAFSSLPinningModeNone

对于AFNetworking来信任服务器,将pinning模式设置为AFSSLPinningModeNone ,则必须将allowInvalidCertificates设置为YES ,但这您正在尝试实现的内容相反

相反,您应该使用固定模式AFSSLPinningModeCertificateAFSSLPinningModePublicKey创build安全策略:

 AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; 

在处理了类似的问题之后,很多浏览器caching来自第三方的证书文件,所以事情看起来很正常,通过浏览器HTTPS连接,因此并不总是需要加载。 因此,很可能你的证书链并不完全被你信任,

换句话说,用浏览器安全地连接看起来很好,但根据你的AFNetworking设置,你的应用程序实际上不会接受你的证书链。 在确定您的设置是适当的之后,下一步是确保您的证书链实际上和您想象的一样好。 下载名为SSL Detective的应用程序并查询您的服务器。 你也可以使用www.ssldecoder.org 。 确保链条中没有红色(不可信任的)物品。 如果有,请在服务器上更改您的证书设置。

鉴于您的AFNetworking设置如下:

  [securityPolicy setAllowInvalidCertificates:NO]; [securityPolicy setValidatesCertificateChain:NO]; 

它可能不喜欢你的证书链,因为它是自签名的。 您可能还必须将其切换为YES。

 - (AFSecurityPolicy *)securityPolicy { NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"*.something.co.in" ofType:@"cer"]; NSData *certData = [NSData dataWithContentsOfFile:cerPath]; AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; [securityPolicy setAllowInvalidCertificates:YES]; [securityPolicy setPinnedCertificates:@[certData]]; [securityPolicy setValidatesDomainName:NO]; [securityPolicy setValidatesCertificateChain:NO]; return securityPolicy; } 

这对我来说是有原因的。 仍然不知道这是如何改变的事情,因为我的应用程序中的其他连接没有采取所有这些步骤。

这是错误生成安全策略的样子 –

 - (AFSecurityPolicy *)securityPolicy { NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"*.something.co.in" ofType:@"cer"]; NSData *certData = [NSData dataWithContentsOfFile:cerPath]; AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; [securityPolicy setAllowInvalidCertificates:NO]; [securityPolicy setPinnedCertificates:@[certData]]; [securityPolicy setValidatesDomainName:YES]; return securityPolicy; } 

现在坚持“不修不破”的规定

对我来说,我有use_frameworks! 在我的Podfile设置 – 该项目不会使Swift的用户,我正在使用Pods AFNetworking 。 对此评论,为我解决了这个问题。

我尝试了所有这些,但没有任何帮助,然后我search了这一行

'NSLog(@“为了validation自签名证书的域名,你必须使用pinning。”);'

在这条线下面我改变了

'return NO;'

'返回YES'

它做了魔术。

谢谢。