iOS开发:对于AFNetworking HTTP转HTTPS请求证书问题
2016-12-20 09:20
561 查看
转载至:http://www.jianshu.com/p/551fa7482def
公司之前的请求都是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的文件;打开你的终端,写下面的命令:
然后把生成的:想要的名字.cer文件导入到工程中,在自己封装AFNetworking的类中,写如下代码:
然后在封装的get请求或者是是post请求的地方,调用上面的这段代码:
当我们的工程中有SDWebimage这个第三放库的时候,加载HTTPS的图片时,在iOS8上面没有问题,但是在iOS9上面,控制台就会报这样的错误:
大概意思也是说网络请求证书的问题,不过我还没有解决这个问题,在网上找了好多,没有找到一个好的方法,如果有哪位朋友遇到这样的问题了,还希望可以在此处给解答一下,千恩万谢!!!
如果想要了解对AFNetworking的封装,请猛戳下面的链接:http://www.jianshu.com/p/bf4e62fe9474
文/First灬DKS(简书作者)
原文链接:http://www.jianshu.com/p/551fa7482def
公司之前的请求都是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
然后把生成的:想要的名字.cer文件导入到工程中,在自己封装AFNetworking的类中,写如下代码:
+ (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.respons be7d eSerializer = [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); } }]; }
当我们的工程中有SDWebimage这个第三放库的时候,加载HTTPS的图片时,在iOS8上面没有问题,但是在iOS9上面,控制台就会报这样的错误:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
大概意思也是说网络请求证书的问题,不过我还没有解决这个问题,在网上找了好多,没有找到一个好的方法,如果有哪位朋友遇到这样的问题了,还希望可以在此处给解答一下,千恩万谢!!!
如果想要了解对AFNetworking的封装,请猛戳下面的链接:http://www.jianshu.com/p/bf4e62fe9474
文/First灬DKS(简书作者)
原文链接:http://www.jianshu.com/p/551fa7482def
相关文章推荐
- iOS开发:对于AFNetworking HTTP转HTTPS请求证书问题
- 对于AFNetworking HTTP转HTTPS请求证书问题
- iOS开发中AFNetworking中如何设置https请求(使用自建证书)
- iOS开发工具-如何使用网络封包分析工具Charles,通过配置proxy对http、https、tcp、udp 等协议的请求响应过程交互信息进行分析、判断、解决我们移动开发中的遇到的各种实际问题。
- iOS开发 https请求网络web自定义证书不信任解决方案
- 【ios开发学习】【swift】Xcode7 使用NSURLSession发送HTTP请求的问题
- IOS开发之——ASIHTTPRequest请求时,发送了2次请求问题解决
- iOS开发:AFNetworking、MKNetworkKit和ASIHTTPRequest比较
- iOS开发中HTTP请求失败问题
- iOS开发:iOS9.0适配之http修改为https、Bitcode、Scheme白名单等问题
- IOS开发之——ASIHTTPRequest请求时,发送了2次请求问题解决
- iOS 开发 https问题使用AFN进行网络请求时做的一些配置
- iOS HTTP到HTTPS证书问题
- iOS开发--Swift 基于AFNetworking 3.0的网络请求封装
- ios开发中asihttprequest请求,汉字乱码问题的解决
- iOS开发:AFNetworking、MKNetworkKit和ASIHTTPRequest比较
- iOS ASIHTTPRequest 多次重复请求的问题
- Win7下 httpRequest带证书请求https网站
- 关于ios开发的证书若干问题
- jdk7下httpclient请求https问题