在AFNetworking中实现 SSL pinning

1.取到证书

客户端需要证书(Certification file), .cer格式的文件。可以跟服务器端索取。
如果他们给个.pem文件,要使用命令行转换:

openssl x509 -inform PEM -in name.pem -outform DER -out name.cer

如果给了个.crt文件,请这样转换:

openssl x509 -in name.crt -out name.cer -outform der

如果啥都不给你,你只能自己动手了:

openssl s_client -connect www.website.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > myWebsite.cer

2.将cer证书拖进项目目录中

把生成的.cer证书摁住直接拖进你的项目相关文件中,记得勾选Copy items if needed和你的targets

3.代码

_sessionManager = [[AFHTTPSessionManager manager]initWithBaseURL:[NSURL URLWithString:BASE_URL]];

        ///ssl证书配置----------------------
            
        //3.https 证书配置
        //3.1 将证书拖进项目
        //3.2 获取证书路径
        NSString *certPath = [[NSBundle mainBundle] pathForResource:@"ssl-bundles" ofType:@"cer"];
        //3.3 获取证书data
        NSData *certData = [NSData dataWithContentsOfFile:certPath];
        //3.4 创建AFN 中的securityPolicy
        AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey withPinnedCertificates
                                                                                  :[[NSSet alloc] initWithObjects:certData,nil]];
        //3.5 这里就可以添加多个server证书
        NSSet *dataSet = [[NSSet alloc]initWithObjects:certData, nil];
        //3.6 绑定证书(不止一个证书)
        [securityPolicy setPinnedCertificates:dataSet];
        //3.7 是否允许无效证书
        [securityPolicy setAllowInvalidCertificates:NO];
        //3.8 是否需要验证域名
        /*
         validatesDomainName 是否需要验证域名,默认为YES;
         假如证书的域名与你请求的域名不一致,需把该项设置为NO;
         如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
         置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。
         因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;
         当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
         如置为NO,建议自己添加对应域名的校验逻辑。
         */
        [securityPolicy setValidatesDomainName:YES];
        
        _sessionManager.securityPolicy = securityPolicy;
        
        [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
        ///--------------------------------------

转载自:https://www.jianshu.com/p/6b0172e42b29

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容