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