美文网首页
iOS AFNetworking关于https的实现

iOS AFNetworking关于https的实现

作者: _Boring | 来源:发表于2019-12-12 11:16 被阅读0次
    Https.jpeg

    https的原理和逻辑就不写了,我自己也一知半解。
    公司服务器用的是阿里云的,然后去找运维要了测试和正式环境的.pem文件,.crt文件也可以的。


    图1.jpg

    双击使用后可以在钥匙串中看到


    图2.png
    右键选择导出.cer文件,命名随意,我这里是只用不同环境的域名命名的,到时候使用方便。
    然后将导出的.cer文件拖到项目中,记得查看Build Phases-> Copy Bundle Resources中有没有,如果没有记得添加一下,不然会用不了。
    下面是代码
    + (AFHTTPSessionManager *)sessionManager {
        //这里要使用initWithBaseURL来初始化,不然会报错,具体使用的时候会看到的
        AFHTTPSessionManager *manager = [[AFHTTPSessionManager manager] initWithBaseURL:[NSURL URLWithString:kOriginalURL]];
        manager.requestSerializer = [AFHTTPRequestSerializer serializer];
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        manager.requestSerializer.timeoutInterval = 15;
        
        //获取应用版本号作为请求头的参数
        NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
        NSString *appCurVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
        
        appCurVersion = [appCurVersion stringByReplacingOccurrencesOfString:@"." withString:@""];
        
        //增加请求头信息
        [manager.requestSerializer setValue:@"ios" forHTTPHeaderField:@"fromType"];
        [manager.requestSerializer setValue:appCurVersion forHTTPHeaderField:@"appVersionCode"];
        
        //证书
        [manager setSecurityPolicy:[self customSecurityPolicy]];
        return manager;
    }
    
    + (AFSecurityPolicy *)customSecurityPolicy {
        //导入证书数据
        //kEnvironmentalKey为文件名,这里我写的是宏,做了不同环境的判定。例如测试是api.test.xxx.com
        NSString *cerPath = [[NSBundle mainBundle] pathForResource:kEnvironmentalKey ofType:@"cer"];
        NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
        //AFSSLPinningModeCertificate 使用证书验证模式
        AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
        securityPolicy.pinnedCertificates = (id)@[cerData];
        //allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
        //如果是需要验证自建证书,需要设置为YES
        securityPolicy.allowInvalidCertificates = YES;
        
        //validatesDomainName 是否需要验证域名,默认为YES;
        //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
        //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
        //如置为NO,建议自己添加对应域名的校验逻辑。
        securityPolicy.validatesDomainName = NO;
        return securityPolicy;
    }
    

    最后就正常使用就好!!!
    写得比较糙,见谅见谅-_-

    相关文章

      网友评论

          本文标题:iOS AFNetworking关于https的实现

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