1.生成.cer文件,并且拖入到自己的項(xiàng)目中
在終端操作:
openssl s_client -connect www.baidu.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > https.cer
注: 將 www.baidu.com 換成你的接口域名 , 最后面的 https.cer 就是你導(dǎo)出的cer證書(shū)名字
2.Xcode info.plist 添加
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
3.使用 AFN
-
(void)testATS {
//先導(dǎo)入證書(shū),找到證書(shū)的路徑
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"https" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];//AFSSLPinningModeNone 這個(gè)模式表示不做 SSL pinning,只跟瀏覽器一樣在系統(tǒng)的信任機(jī)構(gòu)列表里驗(yàn)證服務(wù)端返回的證書(shū)占业。若證書(shū)是信任機(jī)構(gòu)簽發(fā)的就會(huì)通過(guò)耻涛,若是自己服務(wù)器生成的證書(shū)任连,這里是不會(huì)通過(guò)的嘿辟。
//AFSSLPinningModeCertificate 這個(gè)模式表示用證書(shū)綁定方式驗(yàn)證證書(shū)冒萄,需要客戶(hù)端保存有服務(wù)端的證書(shū)拷貝萎河,這里驗(yàn)證分兩步荔泳,第一步驗(yàn)證證書(shū)的域名/有效期等信息蕉饼,第二步是對(duì)比服務(wù)端返回的證書(shū)跟客戶(hù)端返回的是否一致。
//AFSSLPinningModePublicKey 這個(gè)模式同樣是用證書(shū)綁定方式驗(yàn)證玛歌,客戶(hù)端要有服務(wù)端的證書(shū)拷貝昧港,只是驗(yàn)證時(shí)只驗(yàn)證證書(shū)里的公鑰,不驗(yàn)證證書(shū)的有效期等信息支子。只要公鑰是正確的创肥,就能保證通信不會(huì)被竊聽(tīng),因?yàn)橹虚g人沒(méi)有私鑰值朋,無(wú)法解開(kāi)通過(guò)公鑰加密的數(shù)據(jù)叹侄。
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
if (certData) {
securityPolicy.pinnedCertificates = @[certData];
}
AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
[sessionManager setSecurityPolicy:securityPolicy];
sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
sessionManager.responseSerializer.acceptableContentTypes = [sessionManager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];NSString *urlStr = @"https:www.baidu.com";
[sessionManager GET:urlStr parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"responseObject = %@", responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"error = %@", error);
}];
}
因?yàn)橹笆褂昧?AFSSLPinningModeCertificate 模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
改成現(xiàn)在的 AFSSLPinningModeNone 模式,解決問(wèn)題昨登。
因?yàn)槲业淖C書(shū)是 Symantec 的 DV SSL 證書(shū)趾代,所以 securityPolicy 的 allowInvalidCertificates 和 validatesDomainName 屬性都是默認(rèn)值??。之前沒(méi)有改成默認(rèn)一直在報(bào) code = -999.