在APP內(nèi)做HTTPS請(qǐng)求后,使用NSURLConnection或NSURLSession都會(huì)接收到信任相關(guān)的方法回調(diào),做進(jìn)一步的處理。

因?yàn)樵趆ttps的通信過程里,請(qǐng)求方需要使用對(duì)方證書生成一個(gè)隨機(jī)的加密秘鑰,用來做之后請(qǐng)求數(shù)據(jù)的加密。核心問題就是對(duì)方的證書是不是可信任的,所以就有了上面iOS請(qǐng)求回調(diào)的方法。
//NSURLSession的回調(diào)方法
- (void)URLSession:(NSURLSession *)session
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler;
這個(gè)方法結(jié)束內(nèi)部最后需要調(diào)用參數(shù)里的completionHandler,把證書和處置方式傳遞回去。
而NSURLConnection稍微不同,它的委托回調(diào)里,實(shí)現(xiàn)- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;方法,然后在方法里調(diào)用5種處理方法之一:
In this method,you must invoke one of the challenge-responder methods (NSURLAuthenticationChallengeSender
protocol):
關(guān)于證書,一種是從機(jī)構(gòu)簽發(fā)授權(quán)的CA證書,一種是自己生成的證書。證書有一個(gè)授權(quán)鏈,A授權(quán)B,B授權(quán)C,然后有一個(gè)是根證書。在操作系統(tǒng)里會(huì)有受信任的根證書列表,iOS系統(tǒng)的可以查看iOS 中可用的受信任根證書列表。如果根證書是信任的,那么它的授權(quán)鏈里所有證書都通過驗(yàn)證。所以對(duì)于CA證書,如果它的根證書是操作系統(tǒng)本身信任的,那么就可以讓系統(tǒng)做驗(yàn)證。
用電腦瀏覽器做請(qǐng)求的時(shí)候可以直觀的看到,用chrome打開HTTPS網(wǎng)站,然后開發(fā)者工具查看security,點(diǎn)擊view certificate,就可以看到證書的授權(quán)鏈:

在鑰匙串里的系統(tǒng)根證書就可以看到操作系統(tǒng)信任的根證書。
順帶看了下12306的問題,用的是自己做的根證書Sinorail Certification Authority,不是系統(tǒng)默認(rèn)信任的那些機(jī)構(gòu),所以第一次打開總會(huì)看到瀏覽器的警告。瀏覽器為什么警告?為了提醒用戶,因?yàn)橛锌赡苓@是一個(gè)釣魚網(wǎng)站+假的ssl證書。而現(xiàn)在一般的情況是大家都養(yǎng)成了繼續(xù)請(qǐng)求、忽略警告的習(xí)慣。
OSStatus SecTrustEvaluate(SecTrustRef trust, SecTrustResultType * __nullable result)是檢測(cè)的核心方法,會(huì)從當(dāng)前證書沿著授權(quán)鏈驗(yàn)證到根證書。
而如果是自己建的ssl證書,那么就要在APP內(nèi)加入和服務(wù)器相同的證書,使用證書文件來做驗(yàn)證,在請(qǐng)求HTTPS回調(diào)后,驗(yàn)證服務(wù)端的證書和我們本地的證書是否數(shù)據(jù)一致??紤]到授權(quán)鏈的問題,APP內(nèi)的證書可能和服務(wù)端返回的證書是一個(gè)父子關(guān)系,所以需要把服務(wù)端的證書的授權(quán)鏈里所有證書都獲取到后,依次和APP本地的證書做校驗(yàn)。
不過這樣似乎有個(gè)問題,就是你的證書會(huì)暴露在你的APP文件里,如果把APP通過電腦下載下來,拿到ipa文件就可以解壓拿到里面的.cer證書了!
不過剛才看了下iTunes,新版本竟然去掉了APP Store,點(diǎn)擊應(yīng)用全部都跳轉(zhuǎn)到網(wǎng)頁,而網(wǎng)頁沒有下載功能!