在AFNetworking中實(shí)現(xiàn) SSL pinning

1.取到證書

客戶端需要證書(Certification file), .cer格式的文件??梢愿?wù)器端索取。
如果他們給個(gè).pem文件,要使用命令行轉(zhuǎn)換:

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

如果給了個(gè).crt文件,請這樣轉(zhuǎn)換:

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

如果啥都不給你,你只能自己動(dòng)手了:

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

2.將cer證書拖進(jìn)項(xiàng)目目錄中

把生成的.cer證書摁住直接拖進(jìn)你的項(xiàng)目相關(guān)文件中,記得勾選Copy items if needed和你的targets

3.代碼

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

        ///ssl證書配置----------------------
            
        //3.https 證書配置
        //3.1 將證書拖進(jìn)項(xiàng)目
        //3.2 獲取證書路徑
        NSString *certPath = [[NSBundle mainBundle] pathForResource:@"ssl-bundles" ofType:@"cer"];
        //3.3 獲取證書data
        NSData *certData = [NSData dataWithContentsOfFile:certPath];
        //3.4 創(chuàng)建AFN 中的securityPolicy
        AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey withPinnedCertificates
                                                                                  :[[NSSet alloc] initWithObjects:certData,nil]];
        //3.5 這里就可以添加多個(gè)server證書
        NSSet *dataSet = [[NSSet alloc]initWithObjects:certData, nil];
        //3.6 綁定證書(不止一個(gè)證書)
        [securityPolicy setPinnedCertificates:dataSet];
        //3.7 是否允許無效證書
        [securityPolicy setAllowInvalidCertificates:NO];
        //3.8 是否需要驗(yàn)證域名
        /*
         validatesDomainName 是否需要驗(yàn)證域名,默認(rèn)為YES;
         假如證書的域名與你請求的域名不一致,需把該項(xiàng)設(shè)置為NO;
         如設(shè)成NO的話,即服務(wù)器使用其他可信任機(jī)構(gòu)頒發(fā)的證書,也可以建立連接,這個(gè)非常危險(xiǎn),建議打開。
         置為NO,主要用于這種情況:客戶端請求的是子域名,而證書上的是另外一個(gè)域名。
         因?yàn)镾SL證書上的域名是獨(dú)立的,假如證書上注冊的域名是www.google.com,那么mail.google.com是無法驗(yàn)證通過的;
         當(dāng)然,有錢可以注冊通配符的域名*.google.com,但這個(gè)還是比較貴的。
         如置為NO,建議自己添加對應(yīng)域名的校驗(yàn)邏輯。
         */
        [securityPolicy setValidatesDomainName:YES];
        
        _sessionManager.securityPolicy = securityPolicy;
        
        [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
        ///--------------------------------------

轉(zhuǎn)載自:http://www.itdecent.cn/p/6b0172e42b29

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容