iOS开发:对于AFNetworking HTTP转HTTPS请

作者: First灬DKS | 来源:发表于2016-05-05 13:30 被阅读12798次

    公司之前的请求都是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.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);
            }
        }];
    }
    

    当我们的工程中有SDWebimage这个第三放库的时候,加载HTTPS的图片时,在iOS8上面没有问题,但是在iOS9上面,控制台就会报这样的错误:

    NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
    

    大概意思也是说网络请求证书的问题,不过我还没有解决这个问题,在网上找了好多,没有找到一个好的方法,如果有哪位朋友遇到这样的问题了,还希望可以在此处给解答一下,千恩万谢!!!

    如果想要了解对AFNetworking的封装,请猛戳下面的链接:http://www.jianshu.com/p/bf4e62fe9474

    相关文章

      网友评论

      • 4874e13a6e56:我们是自己买的域名,后台改完http和https用网页都能打开,但是在App端用https就访问不了,求教什么问题?
        4874e13a6e56:@First灬DKS 没办法用https://www.baidu.com测试,我这的网址都是一段段拼接的,单独更改一段程序马上crash
        4874e13a6e56:@First灬DKS 我们的证书是在腾讯免费申请的
        First灬DKS:试试https://www.baidu.com可以打开吗?你们的网站打不开,有没有报错之类的提醒呢?
      • 仰望星空之Rocky:楼主是自签的?还是购买的HTTPS域名?
        First灬DKS:@wwwang 自签的,如果是购买的,应该就不需要这么的麻烦了!
      • if_you_like:我们后天只给了我三个.cer 证书你有遇到过吗
        if_you_like:@wwwang 是公司自己买的域名
        仰望星空之Rocky:@if_you_like 你们是自签的?还是购买的HTTPS域名? 比如,,百度的也是HTTPS的,,我使用的AFNetworking去请求html内容或者是图片内容,不需要cer证书,也是可以请求的
        First灬DKS:@if_you_like 我当时是从后台那里拿到了一个.crt的文件,都没给我.cer的;
      • 南方小金豆:我把ATS设置成NSExceptionDomains 后,https无法使用了。Error Domain=NSURLErrorDomain Code=-1200 "发生了 SSL 错误,无法建立与该服务器的安全连接。" UserInfo={_kCFStreamErrorCodeKey=-9824, NSLocalizedRecoverySuggestion=您仍要连接此服务器吗?, NSUnderlyingError=0x174257d30 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9824, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9824}}, NSLocalizedDescription=发生了 SSL 错误,无法建立与该服务器的安全连接。
        是我的证书有问题嘛?
        南方小金豆:@First灬DKS 使用 nscurl --verbose --ats-diagnostics http://www.qq.com/ 这个去验证ATS 发现也不行。验证https://baidu.com 是可以的。这样是不是说服务器有问题
        南方小金豆:@First灬DKS 有什么办法验证是不是证书有问题呢?服务器那边一直说证书是没问题的
        First灬DKS:@那份牵挂给了谁 这些错误好像是证书的问题吧;
      • 代码小白丶:楼主解决SDWebimage加载图片的问题了吗,用https请求
        8bfca968135d:@First灬DKS 我按照上边的方法为什么不行?还是-9813?
        First灬DKS:@First灬DKS 你可以试试这个方法:[[SDWebImageManager sharedManager].imageDownloader setValue: nil forHTTPHeaderField:@"Accept"]; 我试过,可行,原文:http://www.cocoachina.com/bbs/read.php?tid-196523.html
        First灬DKS:@Lynn_Ziv 现在还没能解决,所以还在用HTTP请求图片,如果你找到了好的方法,还希望给说一下;

      本文标题:iOS开发:对于AFNetworking HTTP转HTTPS请

      本文链接:https://www.haomeiwen.com/subject/gsedrttx.html