對于HTTP轉HTTPS請求證書問題

奮斗的七月

2015年9月17日凌晨,蘋果給用戶推送了iOS9正式版,隨著有用戶陸續升級iOS9
iOS9讓所有的HTTP默認使用了HTTPS,原來的HTTP協議傳輸都改成TLS1.2協議進行傳輸。
直接造成的情況就是App發請求的時候彈出網絡無法連接。

----1----https證書請求校驗

----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和證書部分,全部進行校驗;如果正確,才繼續進行。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容