首先介紹一下在https建立的過程中是如何被中間人抓到包的吧甲馋,前提是如果不熟悉https建立連接的過程埂奈,先看一下相關(guān)資料再接著看本文
過程分析
- 客戶端首先要向遠(yuǎn)程的服務(wù)器發(fā)送建立連接的請(qǐng)求,并帶有自己的支持的加解密的方式級(jí)別定躏,這個(gè)過程經(jīng)過了中間人的竊聽账磺,中間人把消息修改后發(fā)給了真正的目的地——服務(wù)端
- 服務(wù)端收到了要建立https鏈接的請(qǐng)求后,會(huì)發(fā)送當(dāng)時(shí)從證書簽發(fā)機(jī)構(gòu)簽發(fā)的公鑰證書共屈。這個(gè)過程中中間人又竊聽了绑谣,然后中間人替換上自己的證書后又轉(zhuǎn)發(fā)給了客戶端。
- 客戶端收到了中間人發(fā)過來的公鑰證書拗引,驗(yàn)證證書的真?zhèn)谓柘a(chǎn)生隨機(jī)的對(duì)稱加密的密鑰,用中間人發(fā)的公鑰加密后發(fā)給了中間人矾削。由于剛才客戶端收到的公鑰證書本身就是中間人產(chǎn)生的壤玫,所以中間人用相應(yīng)的私鑰就解開了,拿到了客戶端產(chǎn)生的那個(gè)隨機(jī)產(chǎn)生的對(duì)稱加密密鑰哼凯。中間人再用剛才服務(wù)端返回的公鑰證書加密這個(gè)客戶端產(chǎn)生的用來對(duì)稱加密的密鑰欲间,發(fā)給服務(wù)端。
- 服務(wù)端收到了當(dāng)時(shí)用自己下發(fā)的公鑰的證書加密的對(duì)稱加密密鑰断部,用自己的私鑰解密猎贴,也得到了對(duì)稱加密的密鑰。
以后的通信都使用這個(gè)對(duì)稱加密的密鑰加密了蝴光。因?yàn)榭蛻舳怂剩虚g人,服務(wù)端都有了這個(gè)對(duì)稱加密的密鑰蔑祟,所以都可以用此解密通信的內(nèi)容趁耗。(上面的步驟是穿插了HTTPS建立握手過程和中間人的作用介紹的,屬于簡(jiǎn)潔介紹疆虚,明白原理就可以了)苛败。
上面有幾個(gè)字“驗(yàn)證證書的真?zhèn)巍睒?biāo)為了紅色满葛,其實(shí)一般來說這個(gè)過程應(yīng)該是安全的,因?yàn)橐话愕淖C書都是由操作系統(tǒng)來管理(Firefox自己管理)的罢屈,所以只要操作系統(tǒng)沒有證書鏈驗(yàn)證等方面的bug是沒有什么問題的嘀韧,但是為了抓包其實(shí)我們是在操作系統(tǒng)中導(dǎo)入了中間人的CA,這樣中間人下發(fā)的公鑰證書就可以被認(rèn)為是合法的儡遮,可以通過驗(yàn)證的(中間人既承擔(dān)了辦法了證書乳蛾,又承擔(dān)了驗(yàn)證證書暗赶,能不通過驗(yàn)證嘛)鄙币。
解決問題方案
客戶端為了解決這個(gè)問題,最好的方式其實(shí)就是內(nèi)嵌證書蹂随,比對(duì)一下這個(gè)證書到底是不是自己真正的“服務(wù)端”發(fā)來的十嘿,而不是中間被替換了。
下面就介紹一下解決的步驟吧:
1岳锁、問運(yùn)維要到接口站點(diǎn)的證書(即當(dāng)初證書機(jī)構(gòu)簽完的那個(gè)放到nginx里的公鑰證書)绩衷,放到工程里面就可以,AF會(huì)自動(dòng)去查找
2激率、AFNetworking設(shè)置以下代碼
AFSecurityPolicy * policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
_manager.securityPolicy = policy;
AF的安全策略會(huì)自動(dòng)的在bundle里面查找公鑰證書咳燕,建立https的時(shí)候進(jìn)行比對(duì)。不一樣直接就失敗了乒躺。
PS:順帶介紹一下AF的AFSSLPinningMode
的三個(gè)級(jí)別
- AFSSLPinningModeNone: (默認(rèn)級(jí)別)招盲,客戶端無條件信任任何下發(fā)的公鑰證書
- AFSSLPinningModePublicKey: 客戶端本地去驗(yàn)證服務(wù)端下發(fā)的公鑰證書的 public keys部分。如果正確才通過
- AFSSLPinningModeCertificate: 客戶端本地去驗(yàn)證服務(wù)端下發(fā)的公鑰證書的所有部分嘉冒。如果正確才通過
這樣做了之后曹货,就可以即使手機(jī)上安裝了抓包工具的CA,抓包工具也不能抓到包了讳推。因?yàn)槟愕目蛻舳嗽隍?yàn)證“服務(wù)端”下發(fā)的公鑰證書的真?zhèn)蔚臅r(shí)候就不會(huì)通過“中間人”下發(fā)的公鑰證書顶籽,也就不會(huì)建立起來https的連接了。
其實(shí)使用了https银觅,并且在系統(tǒng)沒有被攻破或者有證書漏洞的時(shí)候就能保證通信過程的安全了礼饱。但是這樣可以更近一步,以防止競(jìng)爭(zhēng)對(duì)手抓取你們的數(shù)據(jù)之類的究驴,畢竟數(shù)據(jù)被別人抓走了總是不好的镊绪。在寫這個(gè)博文的時(shí)候嘗試了一下可以被中間人抓包工具抓到完整包的有很多,知乎纳胧,貼吧镰吆,等好多。但是銀行的金融類app就抓不到跑慕,相對(duì)的安全了很多了万皿。