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