?中間人攻擊流程:
注意事項(xiàng)說明:中間人用的偽證書盐数,這個(gè)證書可能就是從CA官方申請的哥蔚,客戶端一般都會(huì)信任這類證書慨畸,這就是可以進(jìn)行中間人攻擊的原因所在莱坎。
注釋:在上述流程結(jié)束后,就形成了下面的情況寸士,以后客戶端- - 中間人 - - 服務(wù)端 三者之間的加密內(nèi)容檐什,用的是2組密鑰,所以中間人能看到雙方的通信內(nèi)容弱卡。
二乃正、關(guān)鍵:為什么偽造證書是可以實(shí)現(xiàn)中間人攻擊的?
1.答案就在于用戶讓ios系統(tǒng)信任了不應(yīng)該信任的證書(安裝了證書)婶博。用戶設(shè)置系統(tǒng)信任的證書瓮具,會(huì)作為錨點(diǎn)證書(Anchor Certificate)來驗(yàn)證其他證書。當(dāng)返回的服務(wù)器證書是錨點(diǎn)證書,就被信任搭综。
2.如果從CA申請證書打包到App中垢箕,把這個(gè)證書作為Anchor Certificate來保證證書鏈的唯一性和可信性。只相信app里面的錨點(diǎn)證書兑巾,也就只會(huì)驗(yàn)證通過由這些錨點(diǎn)證書簽發(fā)的證書条获。這樣就算被驗(yàn)證的證書是由系統(tǒng)其他信任的錨點(diǎn)證書簽發(fā)的,也無法驗(yàn)證通過蒋歌。
3.做法:選擇哪個(gè)證書打包到app里面帅掘,很多開發(fā)者會(huì)直接選擇葉子證書。其實(shí)對于自建證書來說堂油,選擇哪一節(jié)點(diǎn)都是可行的修档。而對于由CA頒發(fā)的證書,則建議導(dǎo)入頒發(fā)該證書的CA機(jī)構(gòu)證書或者是更上一級CA機(jī)構(gòu)的證書府框,甚至可以是根證書吱窝。這是因?yàn)椋?/p>
1) 一般葉子證書的有效期都比較短
2) 越往證書鏈的末端,證書越有可能變動(dòng)迫靖;
總結(jié)一句:就是在流程的第8步時(shí)院峡,客戶端檢測系統(tǒng)的證書以外,還檢測證書和客戶端里面的證書是否一致系宜,如果是照激,就是ok,不是盹牧,就拒絕連接俩垃。
三、iOS解決方案
AFSecurityPolicy * securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; //1
securityPolicy.allowInvalidCertificates = NO;//2
securityPolicy.validatesDomainName = YES;//3
//1.
? ? ? ? ?a. AFSSLPinningModeNone : 你不必將憑證跟你的 APP 一起打包汰寓,完全信任伺服器的憑證
? ? ? ? ?b. AFSSLPinningModeCertificate :(注意:如果用這個(gè)選項(xiàng)口柳,必須把證書打包進(jìn)去,不然他會(huì)直接返回NO有滑,整個(gè)請求就) App本地打包證書跃闹,需要使用SecTrustSetAnchorCertificates(),這個(gè)函數(shù)在AFNetworking里面俺孙,就是這個(gè)AFSSLPinningModeCertificate狀態(tài)里面的。
? ? ? ? c. AFSSLPinningModePublicKey : 目前沒有用到
//2 . allowInvalidCertificates 是否允許無效證書(也就是自建的證書)掷贾,默認(rèn)為NO? 如果是需要驗(yàn)證自建證書睛榄,需要設(shè)置為YES
//3. validatesDomainName 是否需要驗(yàn)證域名,默認(rèn)為YES想帅;
//假如證書的域名與你請求的域名不一致场靴,需把該項(xiàng)設(shè)置為NO;如設(shè)成NO的話,即服務(wù)器使用其他可信任機(jī)構(gòu)頒發(fā)的證書旨剥,也可以建立連接咧欣,這個(gè)非常危險(xiǎn),建議打開轨帜。 置為NO魄咕,主要用于這種情況:客戶端請求的是子域名,而證書上的是另外一個(gè)域名蚌父。因?yàn)镾SL證書上的域名是獨(dú)立的哮兰,假如證書上注冊的域名是www.google.com,那么mail.google.com是無法驗(yàn)證通過的苟弛;當(dāng)然喝滞,有錢可以注冊通配符的域名*.google.com,但這個(gè)還是比較貴的膏秫。如置為NO右遭,建議自己添加對應(yīng)域名的校驗(yàn)邏輯。
//AFNetworking爆出HTTPS校驗(yàn)漏洞缤削, AFSecurityPolicy 內(nèi)的參數(shù) validatesDomainName 默認(rèn)為NO窘哈,這會(huì)導(dǎo)致校驗(yàn)證書的時(shí)候不會(huì)校驗(yàn)這個(gè)證書對應(yīng)的域名。即請求返回的服務(wù)器證書僻他,只要是可信任CA機(jī)構(gòu)簽發(fā)的宵距,都會(huì)校驗(yàn)通過,這是非常嚴(yán)重的漏洞吨拗。