原文地址:iOS安全系列之一:HTTPS
如何打造一個(gè)安全的App郑诺?這是每一個(gè)移動(dòng)開(kāi)發(fā)者必須面對(duì)的問(wèn)題。在移動(dòng)App開(kāi)發(fā)領(lǐng)域苗胀,開(kāi)發(fā)工程師對(duì)于安全方面的考慮普遍比較欠缺乳绕,而由于iOS平臺(tái)的封閉性,遭遇到的安全問(wèn)題相比于Android來(lái)說(shuō)要少得多公给,這就導(dǎo)致了許多iOS開(kāi)發(fā)人員對(duì)于安全性方面沒(méi)有太多的深入借帘,但對(duì)于一個(gè)合格的軟件開(kāi)發(fā)者來(lái)說(shuō),安全知識(shí)是必備知識(shí)之一淌铐。
對(duì)于未越獄的iOS設(shè)備來(lái)說(shuō)肺然,由于強(qiáng)大的沙箱和授權(quán)機(jī)制,以及Apple自己掌控的App Store腿准, 基本上杜絕了惡意軟件的入侵(非越獄)际起。但除系統(tǒng)安全之外拾碌,我們還是面臨很多的安全問(wèn)題:網(wǎng)絡(luò)安全、數(shù)據(jù)安全等街望,每一項(xiàng)涉及也非常廣校翔,安全是非常大的課題,本人并非專業(yè)的安全專家灾前,只是從開(kāi)發(fā)者的角度防症,分析我們常遇到的各項(xiàng)安全問(wèn)題,并提出通常的解決方法哎甲,與各位同學(xué)交流學(xué)習(xí)蔫敲。
每一個(gè)軟件工程師都有義務(wù)保護(hù)用戶數(shù)據(jù)的隱私和安全。
首先是網(wǎng)絡(luò)安全炭玫,OSI模型各層都會(huì)面臨相應(yīng)的網(wǎng)絡(luò)安全問(wèn)題奈嘿,涉及寬廣,而網(wǎng)絡(luò)安全也是安全領(lǐng)域發(fā)展最為繁榮的領(lǐng)域吞加。本文我們只是從移動(dòng)應(yīng)用開(kāi)發(fā)角度裙犹,以盡量簡(jiǎn)單的方式,講解HTTPS核心概念知識(shí)榴鼎,以及在iOS平臺(tái)上的實(shí)現(xiàn)伯诬。建議現(xiàn)在還在使用HTTP的應(yīng)用都升級(jí)到HTTPS。
引讀:互聯(lián)網(wǎng)全站HTTPS的時(shí)代已經(jīng)到來(lái)
其實(shí)HTTPS從最終的數(shù)據(jù)解析的角度巫财,與HTTP沒(méi)有任何的區(qū)別盗似,HTTPS就是將HTTP協(xié)議數(shù)據(jù)包放到SSL/TSL層加密后,在TCP/IP層組成IP數(shù)據(jù)報(bào)去傳輸平项,以此保證傳輸數(shù)據(jù)的安全赫舒;而對(duì)于接收端,在SSL/TSL將接收的數(shù)據(jù)包解密之后闽瓢,將數(shù)據(jù)傳給HTTP協(xié)議層接癌,就是普通的HTTP數(shù)據(jù)。HTTP和SSL/TSL都處于OSI模型的應(yīng)用層扣讼。從HTTP切換到HTTPS是一個(gè)非常簡(jiǎn)單的過(guò)程缺猛,在做具體的切換操作之前,我們需要了解幾個(gè)概念:
關(guān)于SSL/TSL椭符,阮一峰的兩篇博客文章做了很好的介紹:
SSL/TLS協(xié)議運(yùn)行機(jī)制的概述
簡(jiǎn)單的來(lái)說(shuō)荔燎,SSL/TSL通過(guò)四次握手,主要交換三個(gè)信息:
數(shù)字證書(shū):該證書(shū)包含了公鑰等信息销钝,一般是由服務(wù)器發(fā)給客戶端有咨,接收方通過(guò)驗(yàn)證這個(gè)證書(shū)是不是由信賴的CA簽發(fā),或者與本地的證書(shū)相對(duì)比蒸健,來(lái)判斷證書(shū)是否可信座享;假如需要雙向驗(yàn)證婉商,則服務(wù)器和客戶端都需要發(fā)送數(shù)字證書(shū)給對(duì)方驗(yàn)證;
三個(gè)隨機(jī)數(shù):這三個(gè)隨機(jī)數(shù)構(gòu)成了后續(xù)通信過(guò)程中用來(lái)對(duì)數(shù)據(jù)進(jìn)行對(duì)稱加密解密的“對(duì)話密鑰”渣叛。
首先客戶端先發(fā)第一個(gè)隨機(jī)數(shù)N1丈秩,然后服務(wù)器回了第二個(gè)隨機(jī)數(shù)N2(這個(gè)過(guò)程同時(shí)把之前提到的證書(shū)發(fā)給客戶端),這兩個(gè)隨機(jī)數(shù)都是明文的淳衙;而第三個(gè)隨機(jī)數(shù)N3(這個(gè)隨機(jī)數(shù)被稱為Premaster secret)癣籽,客戶端用數(shù)字證書(shū)的公鑰進(jìn)行非對(duì)稱加密,發(fā)給服務(wù)器滤祖;而服務(wù)器用只有自己知道的私鑰來(lái)解密,獲取第三個(gè)隨機(jī)數(shù)瓶籽。這樣匠童,服務(wù)端和客戶端都有了三個(gè)隨機(jī)數(shù)N1+N2+N3,然后兩端就使用這三個(gè)隨機(jī)數(shù)來(lái)生成“對(duì)話密鑰”塑顺,在此之后的通信都是使用這個(gè)“對(duì)話密鑰”來(lái)進(jìn)行對(duì)稱加密解密汤求。因?yàn)檫@個(gè)過(guò)程中,服務(wù)端的私鑰只用來(lái)解密第三個(gè)隨機(jī)數(shù)严拒,從來(lái)沒(méi)有在網(wǎng)絡(luò)中傳輸過(guò)扬绪,這樣的話,只要私鑰沒(méi)有被泄露裤唠,那么數(shù)據(jù)就是安全的挤牛。
加密通信協(xié)議:就是雙方商量使用哪一種加密方式,假如兩者支持的加密方式不匹配种蘸,則無(wú)法進(jìn)行通信墓赴;
有個(gè)常見(jiàn)的問(wèn)題,關(guān)于隨機(jī)數(shù)為什么要三個(gè)航瞭?只最后一個(gè)隨機(jī)數(shù)N3不可以么诫硕?
這是由于SSL/TLS設(shè)計(jì),就假設(shè)服務(wù)器不相信所有的客戶端都能夠提供完全隨機(jī)數(shù)刊侯,假如某個(gè)客戶端提供的隨機(jī)數(shù)不隨機(jī)的話章办,就大大增加了“對(duì)話密鑰”被破解的風(fēng)險(xiǎn),所以由三組隨機(jī)數(shù)組成最后的隨機(jī)數(shù)滨彻,保證了隨機(jī)數(shù)的隨機(jī)性藕届,以此來(lái)保證每次生成的“對(duì)話密鑰”安全性。
數(shù)字證書(shū)是一個(gè)電子文檔疮绷,其中包含了持有者的信息翰舌、公鑰以及證明該證書(shū)有效的數(shù)字簽名。而數(shù)字證書(shū)以及相關(guān)的公鑰管理和驗(yàn)證等技術(shù)組成了PKI(公鑰基礎(chǔ)設(shè)施)規(guī)范體系椅贱。一般來(lái)說(shuō)懂算,數(shù)字證書(shū)是由數(shù)字證書(shū)認(rèn)證機(jī)構(gòu)(Certificate authority,即CA)來(lái)負(fù)責(zé)簽發(fā)和管理,并承擔(dān)PKI體系中公鑰合法性的檢驗(yàn)責(zé)任山橄;數(shù)字證書(shū)的類型有很多垮媒,而HTTPS使用的是SSL證書(shū)。
怎么來(lái)驗(yàn)證數(shù)字證書(shū)是由CA簽發(fā)的航棱,而不是第三方偽造的呢睡雇? 在回答這個(gè)問(wèn)題前,我們需要先了解CA的組織結(jié)構(gòu)饮醇。首先它抱,CA組織結(jié)構(gòu)中,最頂層的就是根CA朴艰,根CA下可以授權(quán)給多個(gè)二級(jí)CA观蓄,而二級(jí)CA又可以授權(quán)多個(gè)三級(jí)CA,所以CA的組織結(jié)構(gòu)是一個(gè)樹(shù)結(jié)構(gòu)祠墅。對(duì)于SSL證書(shū)市場(chǎng)來(lái)說(shuō)侮穿,主要被Symantec(旗下有VeriSign和GeoTrust)、Comodo SSL毁嗦、Go Daddy 和 GlobalSign 瓜分亲茅。 了解了CA的組織結(jié)構(gòu)后,來(lái)看看數(shù)字證書(shū)的簽發(fā)流程:
數(shù)字證書(shū)的簽發(fā)機(jī)構(gòu)CA金矛,在接收到申請(qǐng)者的資料后進(jìn)行核對(duì)并確定信息的真實(shí)有效芯急,然后就會(huì)制作一份符合X.509標(biāo)準(zhǔn)的文件。證書(shū)中的證書(shū)內(nèi)容包含的持有者信息和公鑰等都是由申請(qǐng)者提供的驶俊,而數(shù)字簽名則是CA機(jī)構(gòu)對(duì)證書(shū)內(nèi)容進(jìn)行hash加密后得到的娶耍,而這個(gè)數(shù)字簽名就是我們驗(yàn)證證書(shū)是否是有可信CA簽發(fā)的數(shù)據(jù)。
假設(shè)上圖證書(shū)是由證書(shū)簽發(fā)機(jī)構(gòu)CA1簽發(fā)的饼酿。
1)接收端接到一份數(shù)字證書(shū)Cer1后榕酒,對(duì)證書(shū)的內(nèi)容做Hash得到H1;
2)從簽發(fā)該證書(shū)的機(jī)構(gòu)CA1的數(shù)字證書(shū)中找到公鑰故俐,對(duì)證書(shū)上數(shù)字簽名進(jìn)行解密想鹰,得到證書(shū)Cer1簽名的Hash摘要H2;
3)對(duì)比H1和H2药版,如相等辑舷,則表示證書(shū)沒(méi)有被篡改。
4)但這個(gè)時(shí)候還是不知道CA是否是合法的槽片,我們看到上圖中有CA機(jī)構(gòu)的數(shù)字證書(shū)何缓,這個(gè)證書(shū)是公開(kāi)的肢础,所有人都可以獲取到。而這個(gè)證書(shū)中的數(shù)字簽名是上一級(jí)生成的碌廓,所以可以這樣一直遞歸驗(yàn)證下去传轰,直到根CA。根CA是自驗(yàn)證的谷婆,即他的數(shù)字簽名是由自己的私鑰來(lái)生成的慨蛙。合法的根CA會(huì)被瀏覽器和操作系統(tǒng)加入到權(quán)威信任CA列表中,這樣就完成了最終的驗(yàn)證纪挎。所以期贫,一定要保護(hù)好自己環(huán)境(瀏覽器/操作系統(tǒng))中根CA信任列表,信任了根CA就表示信任所有根CA下所有子級(jí)CA所簽發(fā)的證書(shū)异袄,不要隨便添加根CA證書(shū)唯灵。
一般操作系統(tǒng)和瀏覽器只包含根CA機(jī)構(gòu)的證書(shū),而在配置Web服務(wù)器的HTTPS時(shí)隙轻,也會(huì)將配置整個(gè)證書(shū)鏈,所以整個(gè)校驗(yàn)流程是從最后的葉子節(jié)點(diǎn)證書(shū)開(kāi)始垢揩,用父節(jié)點(diǎn)校驗(yàn)子節(jié)點(diǎn)玖绿,一層層校驗(yàn)整個(gè)證書(shū)鏈的可信性。
打個(gè)比喻:父(根CA數(shù)字證書(shū))-子(CA數(shù)字證書(shū))-孫(數(shù)字證書(shū))三代人叁巨,假設(shè)父沒(méi)有其他兄弟(相當(dāng)于根CA機(jī)構(gòu)是唯一的)斑匪,假如子與父進(jìn)行DNA親子鑒定,檢測(cè)DNA位點(diǎn)(即證書(shū)簽名)相同锋勺,那就基本確定子是由父所生蚀瘸;孫與子一樣。這樣就能夠確定孫肯定是源于父一脈庶橱,是父(根CA數(shù)字證書(shū))的合法繼承人贮勃。數(shù)字證書(shū)的驗(yàn)證就是基于同樣的原理。
Basic Constraint校驗(yàn)漏洞
那是否不管多少層都可以這樣一直信任下去呢苏章?理論上是可行的寂嘉,但會(huì)遇到一個(gè)問(wèn)題。假設(shè)我從可信CA機(jī)構(gòu)購(gòu)買了一張證書(shū)枫绅,使用這張證書(shū)簽發(fā)的證書(shū)是否也會(huì)被操作系統(tǒng)和瀏覽器信任呢泉孩?明顯是不應(yīng)該相信的,因?yàn)槲也⒉皇荂A機(jī)構(gòu)并淋,假如我簽發(fā)的證書(shū)也被信任的話寓搬,那我完全可以自己簽發(fā)任何域名的證書(shū)來(lái)進(jìn)行偽造攻擊。這就是著名的Basic Constraint校驗(yàn)漏洞县耽,X.509證書(shū)中的Basic Constraint包含了這是不是一個(gè)CA機(jī)構(gòu)句喷,以及有效證書(shū)路徑的最大深度(即镣典,這個(gè)CA還能否繼續(xù)簽發(fā)CA機(jī)構(gòu)證書(shū)及其簽發(fā)子CA證書(shū)的路徑深度)。但在幾年前脏嚷,包括微軟和Apple都爆出了沒(méi)有正確校驗(yàn)這些信息的漏洞骆撇。
Basic Constraint信息請(qǐng)看下圖:
上圖是Google Internet Authority G2的證書(shū),該證書(shū)是個(gè)CA機(jī)構(gòu)證書(shū)父叙;路徑深度為0神郊,表示該證書(shū)無(wú)法再簽發(fā)CA證書(shū),只能簽發(fā)客戶證書(shū)(client certificate)趾唱。
上圖是google.com的證書(shū)涌乳,這是個(gè)客戶證書(shū)(client certificate),不可再簽發(fā)子證書(shū)甜癞,所以由該證書(shū)簽發(fā)的子證書(shū)是不會(huì)被信任的夕晓。
了解了上面關(guān)于SSL/TSL通信加密策略以及數(shù)字證書(shū)的概念之后,對(duì)HTTPS的安全機(jī)制就有了個(gè)初步的了解悠咱,下面我們看如何在iOS上實(shí)現(xiàn)對(duì)HTTPS的支持蒸辆。
首先,需要明確你使用HTTP/HTTPS的用途析既,因?yàn)镺SX和iOS平臺(tái)提供了多種API躬贡,來(lái)支持不同的用途,官方文檔《Making HTTP and HTTPS Requests》有詳細(xì)的說(shuō)明眼坏,而文檔《HTTPS Server Trust Evaluation》則詳細(xì)講解了HTTPS驗(yàn)證相關(guān)知識(shí)拂玻,這里就不多說(shuō)了。本文主要講解我們最常用的NSURLConnection支持HTTPS的實(shí)現(xiàn)(NSURLSession的實(shí)現(xiàn)方法類似宰译,只是要求授權(quán)證明的回調(diào)不一樣而已)檐蚜,以及怎么樣使用AFNetworking這個(gè)非常流行的第三方庫(kù)來(lái)支持HTTPS。本文假設(shè)你對(duì)HTTP以及NSURLConnection的接口有了足夠的了解沿侈。
相關(guān)的Api在Security Framework中闯第,驗(yàn)證流程如下:
1). 第一步,先獲取需要驗(yàn)證的信任對(duì)象(Trust Object)缀拭。這個(gè)Trust Object在不同的應(yīng)用場(chǎng)景下獲取的方式都不一樣乡括,對(duì)于NSURLConnection來(lái)說(shuō),是從delegate方法-connection:willSendRequestForAuthenticationChallenge:回調(diào)回來(lái)的參數(shù)challenge中獲取([challenge.protectionSpace serverTrust])智厌。
2). 使用系統(tǒng)默認(rèn)驗(yàn)證方式驗(yàn)證Trust Object诲泌。SecTrustEvaluate會(huì)根據(jù)Trust Object的驗(yàn)證策略,一級(jí)一級(jí)往上铣鹏,驗(yàn)證證書(shū)鏈上每一級(jí)數(shù)字簽名的有效性(上一部分有講解)敷扫,從而評(píng)估證書(shū)的有效性。
3). 如第二步驗(yàn)證通過(guò)了,一般的安全要求下葵第,就可以直接驗(yàn)證通過(guò)绘迁,進(jìn)入到下一步:使用Trust Object生成一份憑證([NSURLCredential credentialForTrust:serverTrust]),傳入challenge的sender中([challenge.sender useCredential:cred forAuthenticationChallenge:challenge])處理卒密,建立連接缀台。
4). 假如有更強(qiáng)的安全要求,可以繼續(xù)對(duì)Trust Object進(jìn)行更嚴(yán)格的驗(yàn)證哮奇。常用的方式是在本地導(dǎo)入證書(shū)膛腐,驗(yàn)證Trust Object與導(dǎo)入的證書(shū)是否匹配。更多的方法可以查看Enforcing Stricter Server Trust Evaluation鼎俘,這一部分在講解AFNetworking源碼中會(huì)講解到哲身。
5). 假如驗(yàn)證失敗,取消此次Challenge-Response Authentication驗(yàn)證流程贸伐,拒絕連接請(qǐng)求勘天。
ps: 假如是自建證書(shū)的,則不使用第二步系統(tǒng)默認(rèn)的驗(yàn)證方式捉邢,因?yàn)樽越ㄗC書(shū)的根CA的數(shù)字簽名未在操作系統(tǒng)的信任列表中脯丝。
iOS授權(quán)驗(yàn)證的API和流程大概了解了,下面伏伐,我們看看在NSURLConnection中的代碼實(shí)現(xiàn):
使用NSURLConnection支持HTTPS的實(shí)現(xiàn)
// Now start the connectionNSURL*httpsURL=[NSURLURLWithString:@"https://www.google.com"];self.connection=[NSURLConnectionconnectionWithRequest:[NSURLRequestrequestWithURL:httpsURL]delegate:self];//回調(diào)-(void)connection:(NSURLConnection*)connectionwillSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge*)challenge{//1)獲取trust objectSecTrustReftrust=challenge.protectionSpace.serverTrust;SecTrustResultTyperesult;//2)SecTrustEvaluate對(duì)trust進(jìn)行驗(yàn)證OSStatusstatus=SecTrustEvaluate(trust,&result);if(status==errSecSuccess&&(result==kSecTrustResultProceed||result==kSecTrustResultUnspecified)){//3)驗(yàn)證成功巾钉,生成NSURLCredential憑證cred,告知challenge的sender使用這個(gè)憑證來(lái)繼續(xù)連接NSURLCredential*cred=[NSURLCredentialcredentialForTrust:trust];[challenge.senderuseCredential:credforAuthenticationChallenge:challenge];}else{//5)驗(yàn)證失敗秘案,取消這次驗(yàn)證流程[challenge.sendercancelAuthenticationChallenge:challenge];}}
上面是代碼是通過(guò)系統(tǒng)默認(rèn)驗(yàn)證流程來(lái)驗(yàn)證證書(shū)的。假如我們是自建證書(shū)的呢潦匈?這樣Trust Object里面服務(wù)器的證書(shū)因?yàn)椴皇强尚湃蔚腃A簽發(fā)的阱高,所以直接使用SecTrustEvaluate進(jìn)行驗(yàn)證是不會(huì)成功。又或者茬缩,即使服務(wù)器返回的證書(shū)是信任CA簽發(fā)的赤惊,又如何確定這證書(shū)就是我們想要的特定證書(shū)?這就需要先在本地導(dǎo)入證書(shū)凰锡,設(shè)置成需要參與驗(yàn)證的Anchor Certificate(錨點(diǎn)證書(shū)未舟,通過(guò)SecTrustSetAnchorCertificates設(shè)置了參與校驗(yàn)錨點(diǎn)證書(shū)之后,假如驗(yàn)證的數(shù)字證書(shū)是這個(gè)錨點(diǎn)證書(shū)的子節(jié)點(diǎn)掂为,即驗(yàn)證的數(shù)字證書(shū)是由錨點(diǎn)證書(shū)對(duì)應(yīng)CA或子CA簽發(fā)的裕膀,或是該證書(shū)本身,則信任該證書(shū))勇哗,再調(diào)用SecTrustEvaluate來(lái)驗(yàn)證昼扛。代碼如下
//先導(dǎo)入證書(shū)NSString*cerPath=...;//證書(shū)的路徑NSData*cerData=[NSDatadataWithContentsOfFile:cerPath];SecCertificateRefcertificate=SecCertificateCreateWithData(NULL,(__bridgeCFDataRef)(cerData));self.trustedCertificates=@[CFBridgingRelease(certificate)];//回調(diào)-(void)connection:(NSURLConnection*)connectionwillSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge*)challenge{//1)獲取trust objectSecTrustReftrust=challenge.protectionSpace.serverTrust;SecTrustResultTyperesult;//注意:這里將之前導(dǎo)入的證書(shū)設(shè)置成下面驗(yàn)證的Trust Object的anchor certificateSecTrustSetAnchorCertificates(trust,(__bridgeCFArrayRef)self.trustedCertificates);//2)SecTrustEvaluate會(huì)查找前面SecTrustSetAnchorCertificates設(shè)置的證書(shū)或者系統(tǒng)默認(rèn)提供的證書(shū),對(duì)trust進(jìn)行驗(yàn)證OSStatusstatus=SecTrustEvaluate(trust,&result);if(status==errSecSuccess&&(result==kSecTrustResultProceed||result==kSecTrustResultUnspecified)){//3)驗(yàn)證成功欲诺,生成NSURLCredential憑證cred抄谐,告知challenge的sender使用這個(gè)憑證來(lái)繼續(xù)連接NSURLCredential*cred=[NSURLCredentialcredentialForTrust:trust];[challenge.senderuseCredential:credforAuthenticationChallenge:challenge];}else{//5)驗(yàn)證失敗渺鹦,取消這次驗(yàn)證流程[challenge.sendercancelAuthenticationChallenge:challenge];}}
建議采用本地導(dǎo)入證書(shū)的方式驗(yàn)證證書(shū),來(lái)保證足夠的安全性蛹含。更多的驗(yàn)證方法毅厚,請(qǐng)查看官方文檔《HTTPS Server Trust Evaluation》
AFNetworking是iOS/OSX開(kāi)發(fā)最流行的第三方開(kāi)源庫(kù)之一,其作者是非常著名的iOS/OSX開(kāi)發(fā)者Mattt Thompson浦箱,其博客NSHipster也是iOS/OSX開(kāi)發(fā)者學(xué)習(xí)和開(kāi)闊技術(shù)視野的好地方吸耿。AFNetworking已經(jīng)將上面的邏輯代碼封裝好,甚至更完善憎茂,在AFSecurityPolicy文件中珍语,有興趣可以閱讀這個(gè)模塊的代碼;
AFNetworking上配置對(duì)HTTPS的支持非常簡(jiǎn)單:
NSURL*url=[NSURLURLWithString:@"https://www.google.com"];AFHTTPRequestOperationManager*requestOperationManager=[[AFHTTPRequestOperationManageralloc]initWithBaseURL:url];dispatch_queue_trequestQueue=dispatch_create_serial_queue_for_name("kRequestCompletionQueue");requestOperationManager.completionQueue=requestQueue;AFSecurityPolicy*securityPolicy=[AFSecurityPolicypolicyWithPinningMode:AFSSLPinningModeCertificate];//allowInvalidCertificates 是否允許無(wú)效證書(shū)(也就是自建的證書(shū))竖幔,默認(rèn)為NO//如果是需要驗(yàn)證自建證書(shū)板乙,需要設(shè)置為YESsecurityPolicy.allowInvalidCertificates=YES;//validatesDomainName 是否需要驗(yàn)證域名,默認(rèn)為YES拳氢;//假如證書(shū)的域名與你請(qǐng)求的域名不一致募逞,需把該項(xiàng)設(shè)置為NO;如設(shè)成NO的話馋评,即服務(wù)器使用其他可信任機(jī)構(gòu)頒發(fā)的證書(shū)放接,也可以建立連接,這個(gè)非常危險(xiǎn)留特,建議打開(kāi)纠脾。//置為NO,主要用于這種情況:客戶端請(qǐng)求的是子域名蜕青,而證書(shū)上的是另外一個(gè)域名苟蹈。因?yàn)镾SL證書(shū)上的域名是獨(dú)立的,假如證書(shū)上注冊(cè)的域名是www.google.com右核,那么mail.google.com是無(wú)法驗(yàn)證通過(guò)的慧脱;當(dāng)然,有錢可以注冊(cè)通配符的域名*.google.com贺喝,但這個(gè)還是比較貴的菱鸥。//如置為NO,建議自己添加對(duì)應(yīng)域名的校驗(yàn)邏輯躏鱼。securityPolicy.validatesDomainName=YES;//validatesCertificateChain 是否驗(yàn)證整個(gè)證書(shū)鏈氮采,默認(rèn)為YES//設(shè)置為YES,會(huì)將服務(wù)器返回的Trust Object上的證書(shū)鏈與本地導(dǎo)入的證書(shū)進(jìn)行對(duì)比染苛,這就意味著扳抽,假如你的證書(shū)鏈?zhǔn)沁@樣的://GeoTrust Global CA//? ? Google Internet Authority G2//? ? ? ? *.google.com//那么,除了導(dǎo)入*.google.com之外,還需要導(dǎo)入證書(shū)鏈上所有的CA證書(shū)(GeoTrust Global CA, Google Internet Authority G2)贸呢;//如是自建證書(shū)的時(shí)候镰烧,可以設(shè)置為YES,增強(qiáng)安全性楞陷;假如是信任的CA所簽發(fā)的證書(shū)怔鳖,則建議關(guān)閉該驗(yàn)證,因?yàn)檎麄€(gè)證書(shū)鏈一一比對(duì)是完全沒(méi)有必要(請(qǐng)查看源代碼)固蛾;securityPolicy.validatesCertificateChain=NO;requestOperationManager.securityPolicy=securityPolicy;
這就是AFNetworking的支持HTTPS的主要配置說(shuō)明结执,AFHTTPSessionManager與之基本一致,就不重復(fù)了艾凯。
雖然HTTPS相比于HTTP來(lái)說(shuō)献幔,會(huì)有一定的性能上的劣勢(shì),但對(duì)于網(wǎng)絡(luò)飛速發(fā)展趾诗,移動(dòng)設(shè)備的性能成倍增長(zhǎng)的今天蜡感,安全才是我們更應(yīng)該去考慮的。全網(wǎng)HTTPS并不是那么遙遠(yuǎn)恃泪。
下一篇準(zhǔn)備講內(nèi)存數(shù)據(jù)安全和持久化數(shù)據(jù)的安全郑兴,敬請(qǐng)期待。
版權(quán)所有贝乎,轉(zhuǎn)載請(qǐng)保留Jaminzzhang署名