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所说,将您的固定模式从AFSSLPinningModeNone
为AFSSLPinningModeCertificate
和
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
,但这与您正在尝试实现的内容相反 。
相反,您应该使用固定模式AFSSLPinningModeCertificate
或AFSSLPinningModePublicKey
创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'
它做了魔术。
谢谢。