您的位置:首页 > 理论基础 > 计算机网络

iOS开发:对于AFNetworking HTTP转HTTPS请求证书问题

2017-11-24 00:00 495 查看
公司之前的请求都是HTTP的,现在要把HTTP改成HTTPS,如果我们只是单单的把http改成https,在进行网络请求的时候,会报下面的一大堆错误,大概意思也就是说证书无效,影响请求的安全性:

Domain=NSURLErrorDomain Code=-1202 "此服务器的证书无效。您可能正在连接到一个伪装成“m.dks.com”的服务器,这会威胁到您的机密信息的安全。" UserInfo=0x1741abb40 {NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x1740cdd60>, NSLocalizedRecoverySuggestion=您仍要连接此服务器吗?, _kCFStreamErrorCodeKey=-9813, NSUnderlyingError=0x1740520f0 "未能完成操作。(“kCFErrorDomainCFNetwork”错误 -1202。)", NSLocalizedDescription=此服务器的证书无效。您可能正在连接到一个伪装成“m.dks.com”的服务器,这会威胁到您的机密信息的安全。, NSErrorFailingURLKey=https://m.dks.com//user/login!login.do, NSErrorFailingURLStringKey=https://m.dks.com//user/login!login.do, _kCFStreamErrorDomainKey=3}

我们要做的就是,从后台那里拿到一个.crt后缀的证书文件,把这个文件变成.cer后缀的文件,我此处使用的是命令行;当然你也可以使用Mac上面的钥匙串去访问,让后从政府颁发机构导出.cer的文件;打开你的终端,写下面的命令:

openssl x509 -in 后台给的.crt -out 想要的名字.cer -outform der

+ (AFSecurityPolicy *)customSecurityPolicy
{
//先导入证书,找到证书的路径
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"Admin" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];

//AFSSLPinningModeCertificate 使用证书验证模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];

//allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
//如果是需要验证自建证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES;

//validatesDomainName 是否需要验证域名,默认为YES;
//假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
//置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
//如置为NO,建议自己添加对应域名的校验逻辑。
securityPolicy.validatesDomainName = NO;
NSSet *set = [[NSSet alloc] initWithObjects:certData, nil];
securityPolicy.pinnedCertificates = set;

return securityPolicy;
}

然后在封装的get请求或者是是post请求的地方,调用上面的这段代码:

+ (void)postWithURLString:(NSString *)urlString
parameters:(id)parameters
success:(SuccessBlock)successBlock
failure:(FailureBlock)failureBlock
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.requestSerializer.timeoutInterval = outTime;
//HTTPS SSL的验证,在此处调用上面的代码,给这个证书验证;
[manager setSecurityPolicy:[SYNetworkingManager customSecurityPolicy]];
[manager POST:urlString parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
if (successBlock) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableLeaves error:nil];
successBlock(dic);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
if (failureBlock) {
failureBlock(error);
NSLog(@"网络异常 - T_T%@", error);
}
}];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: