由于蘋(píng)果規(guī)定2017年1月1日以后,所有APP都要使用HTTPS進(jìn)行網(wǎng)絡(luò)請(qǐng)求,否則無(wú)法上架,因此研究了一下在iOS中使用HTTPS請(qǐng)求的實(shí)現(xiàn)。相信大家對(duì)HTTPS都或多或少有些了解,這里我就不再介紹了,主要功能就是將傳輸?shù)膱?bào)文進(jìn)行加密,提高安全性。
一、簡(jiǎn)介
- HTTPS
即 HTTP + SSL 層,具體介紹在這里。 - 關(guān)于 iOS HTTPS 應(yīng)該是大多數(shù)人想要的
二、HTTPS與HTTP的區(qū)別
-
這里用兩張圖來(lái)介紹兩者的區(qū)別:
HTTP:當(dāng)客戶(hù)端發(fā)送請(qǐng)求,那么服務(wù)器會(huì)直接返回?cái)?shù)據(jù)。
HTTP
HTTPS:當(dāng)客戶(hù)端第一次發(fā)送請(qǐng)求的時(shí)候,服務(wù)器會(huì)返回一個(gè)包含公鑰的受保護(hù)空間(也成為證書(shū)),當(dāng)我們發(fā)送請(qǐng)求的時(shí)候,公鑰會(huì)將請(qǐng)求加密再發(fā)送給服務(wù)器,服務(wù)器接到請(qǐng)求之后,用自帶的私鑰進(jìn)行解密,如果正確再返回?cái)?shù)據(jù)。這就是 HTTPS 的安全性所在。
HTTPS
三、分類(lèi)
- 單向認(rèn)證
- 雙向認(rèn)證
具體參考http://www.itdecent.cn/p/25efb6d8ec8c
四、證書(shū)準(zhǔn)備
證書(shū)分為兩種,一種是花錢(qián)向認(rèn)證的機(jī)構(gòu)購(gòu)買(mǎi)的證書(shū),服務(wù)端如果使用的是這類(lèi)證書(shū)的話,那一般客戶(hù)端不需要做什么,用HTTPS進(jìn)行請(qǐng)求就行了,蘋(píng)果內(nèi)置了那些受信任的根證書(shū)的。另一種是自己制作的證書(shū),使用這類(lèi)證書(shū)的話是不受信任的(當(dāng)然也不用花錢(qián)買(mǎi)),因此需要我們?cè)诖a中將該證書(shū)設(shè)置為信任證書(shū)。
1.證書(shū)轉(zhuǎn)換
在服務(wù)器人員,給你發(fā)送的crt證書(shū)后,進(jìn)到證書(shū)路徑,執(zhí)行下面語(yǔ)句
openssl x509 -in 你的證書(shū).crt -out你的證書(shū).cer -outform der
這樣你就可以得到cer類(lèi)型的證書(shū)了。雙擊,導(dǎo)入電腦。
2.證書(shū)放入工程
(1)、可以直接把轉(zhuǎn)換好的cer文件拖動(dòng)到工程中。
(2)、可以在鑰匙串內(nèi),找到你導(dǎo)入的證書(shū),單擊右鍵,導(dǎo)出項(xiàng)目,就可以導(dǎo)出.cer文件的證書(shū)了
=======修改info.plist
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
====AFN 支持https(校驗(yàn)證書(shū),不可以抓包):
// 1.初始化單例類(lèi)
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 注意寫(xiě)法的變化
manager.securityPolicy= [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
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ù)。
// 2.設(shè)置證書(shū)模式
NSString * cerPath = [[NSBundlemainBundle]pathForResource:@"xxx"ofType:@"cer"];
NSData * cerData = [NSDatadataWithContentsOfFile:cerPath];
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[[NSSet alloc] initWithObjects:cerData,nil]];
// 客戶(hù)端是否信任非法證書(shū)
manager.securityPolicy.allowInvalidCertificates = YES;
// 是否在證書(shū)域字段中驗(yàn)證域名
[manager.securityPolicy setValidatesDomainName:NO];
=====AFN 支持https(不校驗(yàn)證書(shū),可以抓包查看):
// 1.初始化單例類(lèi)
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.設(shè)置非校驗(yàn)證書(shū)模式
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
manager.securityPolicy.allowInvalidCertificates = YES;
[manager.securityPolicy setValidatesDomainName:NO];

