gpt4 book ai didi

ios - SSL Pinning 和 AFNetworking 2.5.0 的问题(NSURLErrorDomain 错误 -1012。)

转载 作者:IT王子 更新时间:2023-10-29 07:46:21 28 4
gpt4 key购买 nike

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

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

我们已经测试了 AFNetworking 提供的相当多的配置,但到目前为止还不够幸运。我们收到的错误信息是:

2015-01-05 19:03:07.191 AppName[9301:319051] Error updating user journey. Error: Error Domain=NSURLErrorDomain Code=-1012 "The operation couldn’t be completed. (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 创建您的 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 现在会自动检查您的 bundle 中是否有 .cer 文件,因此如果您要重命名您的证书以具有 .cer 扩展名,您可以删除代码以从 bundle 中获取证书数据并设置固定证书。

关于ios - SSL Pinning 和 AFNetworking 2.5.0 的问题(NSURLErrorDomain 错误 -1012。),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27808249/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com