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所提到的,将您的固定模式从更改AFSSLPinningModeNone为AFSSLPinningModeCertificate
和
B)添加行以禁用验证域名: [policy setValidatesDomainName:NO]
另外一点,AFNetworking现在会自动检查你的软件包中的.cer文件,所以如果你要将你的证书重命名为.cer扩展名,你可以删除代码以从软件包中取出证书数据并设置固定证书.
Eve*_*eng 24
因为你有经理初始化,你可以这样做:
manager.securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy.validatesDomainName = NO;
Run Code Online (Sandbox Code Playgroud)
它适用于自签名证书
我收到了这个错误, Error Domain=NSURLErrorDomain Code=-1012 NSErrorFailingURLStringKey
以下的变化让它对我有用.
self.validatesDomainName = NO;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21032 次 |
| 最近记录: |