在一節(jié)中,我們分析了HTTPS的安全通信過程,知道了HTTPS可以有效防止中間人攻擊。但用過抓包工具的人都知道,比如Charles,F(xiàn)iddler是可以抓取HTTPS請(qǐng)求并解密的,它們是如何做到的呢?
首先來看Charles官網(wǎng)對(duì)HTTPS代理的描述:(推薦學(xué)習(xí):web前端視頻教程)
Charles作為一個(gè)中間人代理,當(dāng)瀏覽器和服務(wù)器通信時(shí),Charles接收服務(wù)器的證書,但動(dòng)態(tài)生成一張證書發(fā)送給瀏覽器,也就是說Charles作為中間代理在瀏覽器和服務(wù)器之間通信,所以通信的數(shù)據(jù)可以被Charles攔截并解密。由于Charles更改了證書,瀏覽器校驗(yàn)不通過會(huì)給出安全警告,必須安裝Charles的證書后才能進(jìn)行正常訪問。
Charles需要做的事情是對(duì)客戶端偽裝服務(wù)端,對(duì)服務(wù)端偽裝客戶端:
截獲真實(shí)客戶端的HTTPS請(qǐng)求,偽裝客戶端向真實(shí)服務(wù)端發(fā)送HTTPS請(qǐng)求
接受真實(shí)服務(wù)器響應(yīng),用Charles自己的證書偽裝服務(wù)端向真實(shí)客戶端發(fā)送數(shù)據(jù)內(nèi)容
下面來看具體的流程:
客戶端向服務(wù)器發(fā)起HTTPS請(qǐng)求
Charles攔截客戶端的請(qǐng)求,偽裝成客戶端向服務(wù)器進(jìn)行請(qǐng)求
服務(wù)器向“客戶端”(實(shí)際上是Charles)返回服務(wù)器的CA證書
Charles攔截服務(wù)器的響應(yīng),獲取服務(wù)器證書公鑰,然后自己制作一張證書,將服務(wù)器證書替換后發(fā)送給客戶端。(這一步,Charles拿到了服務(wù)器證書的公鑰)
客戶端接收到“服務(wù)器”(實(shí)際上是Charles)的證書后,生成一個(gè)對(duì)稱密鑰,用Charles的公鑰加密,發(fā)送給“服務(wù)器”(Charles)
Charles攔截客戶端的響應(yīng),用自己的私鑰解密對(duì)稱密鑰,然后用服務(wù)器證書公鑰加密,發(fā)送給服務(wù)器。(這一步,Charles拿到了對(duì)稱密鑰)
服務(wù)器用自己的私鑰解密對(duì)稱密鑰,向“客戶端”(Charles)發(fā)送響應(yīng)
Charles攔截服務(wù)器的響應(yīng),替換成自己的證書后發(fā)送給客戶端
至此,連接建立,Charles拿到了 服務(wù)器證書的公鑰 和 客戶端與服務(wù)器協(xié)商的對(duì)稱密鑰,之后就可以解密或者修改加密的報(bào)文了。
HTTPS抓包的原理還是挺簡單的,簡單來說,就是Charles作為“中間人代理”,拿到了 服務(wù)器證書公鑰 和 HTTPS連接的對(duì)稱密鑰,前提是客戶端選擇信任并安裝Charles的CA證書,否則客戶端就會(huì)“報(bào)警”并中止連接。這樣看來,HTTPS還是很安全的