在關(guān)于HTTPS,你需要知道的全部中,分析了HTTPS的安全通信過(guò)程,知道了HTTPS可以有效防止中間人攻擊。但用過(guò)抓包工具的人都知道,比如Charles,F(xiàn)iddler是可以抓取HTTPS請(qǐng)求并解密的,它們是如何做到的呢?
首先來(lái)看Charles官網(wǎng)對(duì)HTTPS代理的描述:
Charles can be used as a man-in-the-middle HTTPS proxy, enabling you to view in plain text the communication between web browser and SSL web server.`
Charles does this by becoming a man-in-the-middle. Instead of your browser seeing the server’s certificate, Charles dynamically generates a certificate for the server and signs it with its own root certificate (the Charles CA Certificate). Charles receives the server’s certificate, while your browser receives Charles’s certificate. Therefore you will see a security warning, indicating that the root authority is not trusted. If you add the Charles CA Certificate to your trusted certificates you will no longer see any warnings – see below for how to do this.
Charles作為一個(gè)“中間人代理”,當(dāng)瀏覽器和服務(wù)器通信時(shí),Charles接收服務(wù)器的證書,但動(dòng)態(tài)生成一張證書發(fā)送給瀏覽器,也就是說(shuō)Charles作為中間代理在瀏覽器和服務(wù)器之間通信,所以通信的數(shù)據(jù)可以被Charles攔截并解密。由于Charles更改了證書,瀏覽器校驗(yàn)不通過(guò)會(huì)給出安全警告,必須安裝Charles的證書后才能進(jìn)行正常訪問(wèn)。
下面來(lá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抓包的原理還是挺簡(jiǎn)單的,簡(jiǎn)單來(lái)說(shuō),就是Charles作為“中間人代理”,拿到了 服務(wù)器證書公鑰 和 HTTPS連接的對(duì)稱密鑰,前提是客戶端選擇信任并安裝Charles的CA證書,否則客戶端就會(huì)“報(bào)警”并中止連接。這樣看來(lái),HTTPS還是很安全的。