我们一直很难使用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);
}];
}
谢谢!
答案 0 :(得分:46)
阅读AFNetworking代码&并检查更改日志,这是我必须做的工作才能使其正常工作。
使用AFSSLPinningModeCertificate创建AFSecurityPolicy对象:
AFSecurityPolicy* policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
默认情况下,AFNetworking将验证证书的域名。我们的证书是基于每个服务器生成的,并非所有证书都有域名,因此我们需要禁用它:
[policy setValidatesDomainName:NO];
由于证书是自签名的,因此它们在技术上是无效的,所以我们也需要允许它:
[policy setAllowInvalidCertificates:YES];
最后,AFNetworking将尝试在证书链上一直验证证书,这对我来说似乎只会链接到我们的CA,但无论出于什么原因它都没有,所以我们有禁用它:
[policy setValidatesCertificateChain:NO];
那就是它!在您的请求管理器中设置安全策略,就像您已经做的那样,它应该可以正常工作。
所以,回顾一下,您发布的代码中真正需要更改的是:
A)提及David Caunt时,将固定模式从AFSSLPinningModeNone
更改为AFSSLPinningModeCertificate
和
B)添加该行以禁用验证域名:[policy setValidatesDomainName:NO]
另一个注意事项,AFNetworking现在会自动检查你的软件包是否有.cer文件,所以如果你要将你的证书重命名为.cer扩展名,你可以删除代码以从软件包中取出证书数据并设置固定证书。
答案 1 :(得分:24)
因为你有经理初始化,你可以这样做:
manager.securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy.validatesDomainName = NO;
它适用于自签名证书
答案 2 :(得分:5)
我收到此错误,Error Domain=NSURLErrorDomain Code=-1012 NSErrorFailingURLStringKey
仅凭下面的改变让它为我工作。
self.validatesDomainName = NO;
答案 3 :(得分:3)
您正在使用AFSecurityPolicy
模式SSLPinningMode
创建AFSSLPinningModeNone
。
要让AFNetworking信任服务器,并将固定模式设置为AFSSLPinningModeNone
,您必须将allowInvalidCertificates
设置为YES
,但这是相反的你想要实现。
相反,您应该使用固定模式AFSSLPinningModeCertificate
或AFSSLPinningModePublicKey
创建安全策略:
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
答案 4 :(得分:1)
- (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;
}
现在坚持不要修复它,如果它没有被打破"规则
答案 5 :(得分:0)
处理过类似的问题后,通常会通过浏览器HTTPS连接看起来很正常,因为许多浏览器会缓存来自第三方的证书文件,因此并不总是需要加载它们。因此,很可能您的证书链不完全受信任,因为您可能已经相信。
换句话说,与浏览器安全连接似乎很好,但根据您的AFNetworking设置,您的应用实际上不会接受您的证书链。在确定您的设置合适之后,下一步是确保您的证书链实际上与您认为的一样好。下载名为SSL Detective的应用程序并查询您的服务器。您也可以使用www.ssldecoder.org。确保链中没有红色(不受信任)的物品。如果有,请更改服务器上的证书设置。
鉴于您的AFNetworking设置如下:
[securityPolicy setAllowInvalidCertificates:NO];
[securityPolicy setValidatesCertificateChain:NO];
它可能不喜欢您的证书链,因为它是自签名的。您可能还需要将它们切换为YES。
答案 6 :(得分:0)
对我来说,我在use_frameworks!
设置了Podfile
- 该项目并未使用Swift,我使用Pods
作为AFNetworking
。对此进行评论,为我解决了这个问题。
答案 7 :(得分:0)
如果您只想在没有客户端证书的情况下使警告静音,则该策略应如下所示:
AFSecurityPolicy* policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
[policy setValidatesDomainName:YES];
[policy setAllowInvalidCertificates:NO];
答案 8 :(得分:-2)
我尝试了所有这些,但没有任何帮助,然后我搜索了这一行
'NSLog(@“为了验证自签名证书的域名,你必须使用固定。”);'
在这条线下面,我改变了
'返回NO;'
到
'返回YES;'
它完成了魔术。
感谢。