奮斗的七月
2015年9月17日凌晨,蘋果給用戶推送了iOS9正式版,隨著有用戶陸續升級iOS9
iOS9讓所有的HTTP默認使用了HTTPS,原來的HTTP協議傳輸都改成TLS1.2協議進行傳輸。
直接造成的情況就是App發請求的時候彈出網絡無法連接。
----1----https證書請求校驗
- 命令行
nscurl --ats-diagnostics --verbose https://www.baidu.com - 騰訊云
[騰訊云](https://www.qcloud.com/product/ssl
----2----info.plist設置
info.plist里面把
App Transport Security Settings
Allow Arbitrary Loads 設置為NO
----3----證書轉化
命令行
openssl x509 -in 1.crt -out YJHhttps.cer -outform der
1.crt(后臺給的證書)
YJHhttps.cer(導出自己用的證書)通過安裝crt文件,電腦導出
1)先打開“鑰匙串訪問”
2)選中你安裝的crt文件證書,選擇“文件”--》“導出項目”
----4----把證書導入項目-代碼適配
#pragma mark -----適配Https證書
+ (AFSecurityPolicy *)customSecurityPolicy
{
//先導入證書,找到證書的路徑
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"YJHhttps" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
//AFSSLPinningModeCertificate 使用證書驗證模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
//allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認為NO
//如果是需要驗證自建證書,需要設置為YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要驗證域名,默認為YES;
//假如證書的域名與你請求的域名不一致,需把該項設置為NO;如設成NO的話,即服務器使用其他可信任機構頒發的證書,也可以建立連接,這個非常危險,建議打開。
//置為NO,主要用于這種情況:客戶端請求的是子域名,而證書上的是另外一個域名。因為SSL證書上的域名是獨立的,假如證書上注冊的域名是www.google.com,那么mail.google.com是無法驗證通過的;當然,有錢可以注冊通配符的域名*.google.com,但這個還是比較貴的。
//如置為NO,建議自己添加對應域名的校驗邏輯。
securityPolicy.validatesDomainName = NO;
NSSet *set = [[NSSet alloc] initWithObjects:certData, nil];
securityPolicy.pinnedCertificates = set;
return securityPolicy;
}
//---使用這個屬性AFSSLPinningModeCertificate
AFSSLPinningModeNone: 代表客戶端無條件地信任服務器端返回的證書。
AFSSLPinningModePublicKey: 代表客戶端會將服務器端返回的證書與本地保存的證書中,PublicKey的部分進行校驗;如果正確,才繼續進行。
AFSSLPinningModeCertificate: 代表客戶端會將服務器端返回的證書和本地保存的證書中的所有內容,包括PublicKey和證書部分,全部進行校驗;如果正確,才繼續進行。