在一節中,我們分析了HTTPS的安全通訊過程,知道了HTTPS可以有效防止中間人攻擊。但用過抓包工具的人都知道,例如Charles,Fiddler是可以抓取HTTPS請求並解密的,而它們又是如何做到的呢?
首先來看Charles官網對HTTPS代理的描述:(推薦學習:web前端影片教學)
Charles作為一個中間人代理,當瀏覽器和伺服器通訊時,Charles接收伺服器的證書,但動態產生一張證書發送給瀏覽器,也就是說Charles作為中間代理在瀏覽器和伺服器之間通信,所以通信的資料可以被Charles攔截並解密。由於Charles更改了證書,瀏覽器校驗不通過會給予安全警告,必須安裝Charles的證書後才能進行正常存取。
Charles需要做的事情是對客戶端偽裝服務端,對服務端偽裝客戶端:
截獲真實客戶端的HTTPS請求,偽裝客戶端向真實服務端發送HTTPS請求
接受真實伺服器回應,用Charles自己的憑證偽裝服務端傳送資料內容給真實客戶端
下面來看具體的流程:
客戶端向伺服器發起HTTPS請求
Charles攔截客戶端的請求,偽裝成客戶端向伺服器進行請求
伺服器向「客戶端」(實際上是Charles)傳回伺服器的CA證書
Charles攔截伺服器的回應,取得伺服器憑證公鑰,然後自己製作一張證書,將伺服器憑證取代後傳送給客戶端。 (這一步,Charles拿到了伺服器憑證的公鑰)
客戶端接收到「伺服器」(實際上是Charles)的憑證後,產生一個對稱金鑰,用Charles的公鑰加密,發送給「伺服器」(Charles)
Charles攔截客戶端的回應,用自己的私鑰解密對稱金鑰,然後用伺服器憑證公鑰加密,傳送給伺服器。 (這一步,Charles拿到了對稱金鑰)
伺服器用自己的私鑰解密對稱金鑰,向「客戶端」(Charles)發送回應
Charles攔截伺服器的回應,替換成自己的憑證後傳送給客戶端
至此,連線建立,Charles拿到了伺服器憑證的公鑰和客戶端與伺服器協商的對稱金鑰,之後就可以解密或修改加密的封包了。
HTTPS抓包的原理還挺簡單的,簡單來說,就是Charles作為“中間人代理”,拿到了伺服器憑證公鑰和HTTPS連接的對稱金鑰,前提是客戶端選擇信任並安裝Charles的CA證書,否則客戶端就會「報警」並中止連線。這樣看來,HTTPS還是很安全的
#以上是https抓包原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!