美文网首页IOS开发者心得
iOS AFNetworking HTTP转HTTPS适配

iOS AFNetworking HTTP转HTTPS适配

作者: CoderSJun | 来源:发表于2016-12-22 19:05 被阅读1074次

    在WWDC 2016开发者大会上,苹果宣布了一个最后期限:到2017年1月1日 App Store中的所有应用都必须启用 App Transport Security安全功能。也就是说,自2017年起,网络请求必须由http改成https。

    今天后台自己配置了一个免费https证书,我直接将项目中的域名的http 改成https 结果报错:

     failure................failure ....... error: Error Domain=NSURLErrorDomain Code=-1202 "****此服务器的证书无效。您可能正在连接到一个伪装成****“.com”****的服务器,这会威胁到您的机密信息的安全。****" UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=, NSLocalizedRecoverySuggestion=****您仍要连接此服务器吗?****, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9807, NSErrorPeerCertificateChainKey=(**
    **"",**
    **""**
    **), 
    NSUnderlyingError=0x608000242340 {Error Domain=kCFErrorDomainCFNetwork Code=-1202 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=, _kCFNetworkCFStreamSSLErrorOriginalValue=-9807, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9807, kCFStreamPropertySSLPeerCertificates=(**
    **"",**
    **""**
    **)}}, NSLocalizedDescription=****此服务器的证书无效。您可能正在连接到一个伪装成****“”****的服务器,这会威胁到您的机密信息的安全。****, NSErrorFailingURLKey=..,**
    **NSErrorFailingURLStringKey=.., NSErrorClientCertificateStateKey=0}**
    

    在网上查了一些资料 做一点笔记
    参考:iOS开发:对于AFNetworking HTTP转HTTPS请求证书问题
    详细的证书介绍:iOS开发:对于AFNetworking HTTP转HTTPS请求证书问题
    HTTPS服务器满足ATS默认的条件,而且SSL证书是通过权威的CA机构认证过的,那么我们在使用Xcode开发的时候,对网络的适配什么都不用做,我们也能正常与服务器通信。但是,当我们对安全性有更高的要求时或者我们自建证书时,我们需要本地导入证书来进行验证。
    使用AFNetworking来支持https
    步骤:
    1.从后台那里拿到一个.crt后缀的证书文件,把这个文件变成.cer后缀的文件,打开你的终端,写下面的命令:
    openssl x509 -in 后台给的名字.cet -out 你想要的名字.cer -outform der

    2.将生成的cer文件导入到工程中 在封装的AFN请求基类中介入以下代码:

    //https证书
    + (AFSecurityPolicy *)customSecurityPolicy
    {
        //先导入证书,找到证书的路径
        NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"www.mxingm.com" 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;
    } 
    

    然后在AFN请求的方法中加上:

    + (void)executeRequestAndIsPost:(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的图片时,大家可以绕过证书验证去加载图片

    [imageView sd_setImageWithURL:[NSURL URLWithString:urlString] placeholderImage:self.placeholder options:SDWebImageAllowInvalidSSLCertificates];
    
    

    这就是AFN升级HTTPS的一些总结 觉得有帮助的参考和总结.希望帮到你:-D

    相关文章

      网友评论

      • MMOTE:问下,拿到的证书是.crt的,修改后缀的命令行里第一个文件后缀是.cet,是不是写错了???
      • LD_左岸:老哥的意思是不是说 只要不报错 我就不用管了
        我们也是有http改成https了
        但是我只在我原来的url上加了个s仅此而已
        我发现没报错 正常可以请求数据'
        我是不是啥也不用做了呢?
        CoderSJun:@左岸__ 能请求的话我们这边不用做配置,当时我们公司的证书不是买的,只加了一个s没有用所以配置了一下
      • 十一岁的加重:空格都混在一起
        CoderSJun:@老阿姨代码 是这句命令 先cd进你要保存的文件夹 cet放在里面 然后输入这句命令。 名字注意对应好 in out后面有空格 注意不要删除了
        openssl x509 -in 后台给的名字.cet -out 你想要的名字.cer -outform der
        HKrystal:终端输入命令修改后缀报错是怎么回事?终端打开后只需输入上述那条命令就可以吗
        CoderSJun:复制时候有问题了啊?

      本文标题:iOS AFNetworking HTTP转HTTPS适配

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