寫在前面的話
在iOS9之前公司就用了HTTPS蕴坪,iOS9蘋果把所有的HTTP請(qǐng)求都改為HTTPS了,HTTPS也變成了趨勢(shì)睹晒。iOS9系統(tǒng)發(fā)送的網(wǎng)絡(luò)請(qǐng)求將統(tǒng)一使用TLS 1.2 SSL毅否。采用TLS 1.2 協(xié)議刑桑,目的是 強(qiáng)制增強(qiáng)數(shù)據(jù)訪問安全,而且系統(tǒng) Foundation 框架下的相關(guān)網(wǎng)絡(luò)請(qǐng)求譬淳,將不再默認(rèn)使用 Http 等不安全的網(wǎng)絡(luò)協(xié)議档址,而默認(rèn)采用 TLS 1.2。
Apple讓你的HTTP采用SSL/TLS協(xié)議邻梆,就是讓你從HTTP轉(zhuǎn)到HTTPS守伸。
不使用SSL/TLS的HTTP通信,就是不加密的通信浦妄!
所有信息明文傳播尼摹,帶來了三大風(fēng)險(xiǎn):
- 竊聽風(fēng)險(xiǎn)(eavesdropping):第三方可以獲知通信內(nèi)容。
- 篡改風(fēng)險(xiǎn)(tampering):第三方可以修改通信內(nèi)容剂娄。
- 冒充風(fēng)險(xiǎn)(pretending):第三方可以冒充他人身份參與通信蠢涝。
SSL/TLS協(xié)議是為了解決這三大風(fēng)險(xiǎn)而設(shè)計(jì)的,希望達(dá)到:
- 所有信息都是加密傳播阅懦,第三方無法竊聽和二。
- 具有校驗(yàn)機(jī)制,一旦被篡改耳胎,通信雙方會(huì)立刻發(fā)現(xiàn)儿咱。
- 配備身份證書庭砍,防止身份被冒充。
https原理
HTTPS在傳輸數(shù)據(jù)之前需要客戶端(瀏覽器)與服務(wù)端(網(wǎng)站)之間進(jìn)行一次握手混埠,在握手過程中將確立雙方加密傳輸數(shù)據(jù)的密碼信息怠缸。客戶端和服務(wù)端建立一個(gè)連接钳宪,服務(wù)端返回一個(gè)證書揭北,客戶端里存有各個(gè)受信任的證書機(jī)構(gòu)根證書,用這些根證書對(duì)服務(wù)端 返回的證書進(jìn)行驗(yàn)證吏颖,經(jīng)驗(yàn)證如果證書是可信任的搔体,就生成一個(gè)pre-master secret,用這個(gè)證書的公鑰加密后發(fā)送給服務(wù)端半醉,服務(wù)端用私鑰解密后得到pre-master secret疚俱,再根據(jù)某種算法生成master secret,客戶端也同樣根據(jù)這種算法從pre-master secret生成master secret缩多,隨后雙方的通信都用這個(gè)master secret對(duì)傳輸數(shù)據(jù)進(jìn)行加密解密呆奕。
證書
NSURLSession 支持 cer 格式的證書文件,但是一般從管理員手里拿到的都是 crt 格式的證書衬吆,需要先安裝到系統(tǒng)梁钾,在用鑰匙串導(dǎo)出 cer 格式證書。
實(shí)現(xiàn)
如果使用AFNetworking逊抡,那么實(shí)現(xiàn)起來還是姆泻,首先把 cer 格式的證書拖到工程里。
然后新建AFHTTPRequestOperationManager就好了
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy = securityPolicy;`
AFSecurityPolicy這個(gè)類是AFN的設(shè)置SSL鋼釘?shù)念惷暗眨?種驗(yàn)證方式:
- AFSSLPinningModeNone: 這個(gè)模式表示不做SSL pinning拇勃,只跟瀏覽器一樣在系統(tǒng)的信任機(jī)構(gòu)列表里驗(yàn)證服務(wù)端返回的證書。若證書是信任機(jī)構(gòu)簽發(fā)的就會(huì)通過孝凌,若是自己服務(wù)器生成的證書潜秋,這里是不會(huì)通過的。(這個(gè)模式是不安全的)
- AFSSLPinningModePublicKey: 代表客戶端會(huì)將服務(wù)器端返回的證書與本地保存的證書中胎许,PublicKey的部分進(jìn)行校驗(yàn)峻呛;如果正確,才繼續(xù)進(jìn)行辜窑。
- AFSSLPinningModeCertificate: 代表客戶端會(huì)將服務(wù)器端返回的證書和本地保存的證書中的所有內(nèi)容钩述,包括PublicKey和證書部分,全部進(jìn)行校驗(yàn)穆碎;如果正確牙勘,才繼續(xù)進(jìn)行。
2和3都需要把證書內(nèi)置在 app Bundle中。
一般情況使用AFSSLPinningModePublicKey就好了方面,AFN的方法是讀取app中所有.cer后綴的文件就行匹配放钦。
如果直接設(shè)置AFSSLPinningModeNone,HTTPS也是能正常訪問的恭金,但是就沒有校驗(yàn)證書操禀,失去HTTPS的意義。
簡(jiǎn)單說:HTTP+SSL/TLS+TCP = HTTPS横腿,只有證書匹配才會(huì)完成服務(wù)器請(qǐng)求颓屑,得到數(shù)據(jù)。