測試或者開發除錯的過程中,經常會進行抓包分析,並且裝上抓包工具的證書就能抓取 HTTPS
的資料包並顯示。由此就產生了一個疑問,為什麼抓包工具裝上證書後就能抓到 HTTPS
的包並顯示呢?不是說 HTTPS
是加密傳輸的嗎?
今天這篇文章就來探究下上面這個問題,要解釋清楚這個問題,我會通過解答以下兩個問題來講述:
HTTPS 到底是什麼? 抓包工具抓包的原理?
HTTPS 到底是什麼
HTTP
作為一種被廣泛使用的傳輸協議,也存在一些的缺點:
無狀態(可以通過 Cookie 或 Session 解決); 明文傳輸; 不安全;
為了解決 “明文” 和 “不安全” 兩個問題,就產生了 HTTPS
。HTTPS
不是一種單獨的協議,它是由 HTTP
+ SSL/TLS
組成。
所以要理解 HTTPS
就只需在 HTTP
的基礎上理解 SSL/TLS
(TLS 是 SSL 的後續版本,現在一般使用 TLS),下面就來了解下 TLS
是什麼。
TLS
❝「傳輸層安全性協議」(英語:「T」ransport 「L」ayer 「S」ecurity,縮寫:「TLS」)及其前身「安全套接層」(英語:「S」ecure 「S」ockets 「L」ayer,縮寫:「SSL」)是一種「安全協議」,目的是為網際網路通訊提供安全及「資料完整性」保障。
❞
TLS
由記錄協議、握手協議、警報協議、變更密碼規範協議、擴充套件協議等幾個子協議組成,綜合使用了對稱加密、非對稱加密、身份認證等許多密碼學前沿技術。
「記錄協議」 規定 TLS
收發資料的基本單位為:記錄。類似TCP
裡的segment
,所有其它子協議都需要通過記錄協議發出。「警報協議」 的職責是向對方發出警報資訊,類似於 HTTP
裡的狀態碼。「握手協議」 是 TLS
裡最複雜的子協議,瀏覽器和伺服器在握手過程中會協商TLS
版本號、隨機數、密碼套件等資訊,然後交換證書和金鑰引數,最終雙方協商得到會話金鑰,用於後續的混合加密系統。「變更密碼規範協議」 用於告知對方,後續的資料都將使用加密傳輸。
TLS
的握手過程:
握手過程抓包顯示:
交換金鑰的過程為:
客戶端發起一個請求給伺服器; 伺服器生成一對非對稱的公鑰( pubkey
)和私鑰(privatekey
),然後把公鑰附加到一個CA數字證書
上返回給客戶端;客戶端校驗該證書是否合法(通過瀏覽器內建的廠商根證書等手段校驗),然後從證書中提取出公鑰( pubkey
);客戶端生成一個隨機數( key
),然後使用公鑰(pubkey
)對這個隨機數進行加密後傳送給伺服器;伺服器利用私鑰( privatekey
)對收到的隨機數密文進行解密得到key
;後續客戶端和伺服器傳輸資料使用該 key
進行加密後再傳輸;
抓包工具抓包的原理
先來看看抓 HTTP
包的原理
首先抓包工具會提供出代理服務,客戶端需要連線該代理; 客戶端發出 HTTP
請求時,會經過抓包工具的代理,抓包工具將請求的原文進行展示;抓包工具使用該原文將請求傳送給伺服器; 伺服器返回結果給抓包工具,抓包工具將返回結果進行展示; 抓包工具將伺服器返回的結果原樣返回給客戶端;
抓包工具就相當於個透明的中間人,資料經過的時候它一隻手接到資料,然後另一隻手把資料傳出去。
再來看看 HTTPS
的抓包
這個時候抓包工具對客戶端來說相當於伺服器,對伺服器來說相當於客戶端。在這個傳輸過程中,客戶端會以為它就是目標伺服器,伺服器也會以為它就是請求發起的客戶端。
客戶端連線抓包工具提供的代理服務; 客戶端需要安裝抓包工具的根證書; 客戶端發出 HTTPS
請求,抓包工具模擬伺服器與客戶端進行TLS
握手交換金鑰等流程;抓包工具傳送一個 HTTPS
請求給客戶端請求的目標伺服器,並與目標伺服器進行TLS
握手交換金鑰等流程;客戶端使用與抓包工具協定好的金鑰加密資料後傳送給抓包工具; 抓包工具使用與客戶端協定好的金鑰解密資料,並將結果進行展示; 抓包工具將解密後的客戶端資料,使用與伺服器協定好的金鑰進行加密後傳送給目標伺服器; 伺服器解密資料後,做對應的邏輯處理,然後將返回結果使用與抓包工具協定好的金鑰進行加密傳送給抓包工具; 抓包工具將伺服器返回的結果,用與伺服器協定好的金鑰解密,並將結果進行展示; 抓包工具將解密後的伺服器返回資料,使用與客戶端協定好的金鑰進行加密後傳送給客戶端; 客戶端解密資料;
總結
HTTPS
不是單獨的一個協議,它是HTTP
+SSL/TLS
的組合;TLS
是傳輸層安全性協議,它會對傳輸的HTTP
資料進行加密,使用非對稱加密和對稱加密的混合方式;抓包工具的原理就是“偽裝“,對客戶端偽裝成伺服器,對伺服器偽裝成客戶端; 使用抓包工具抓 HTTPS
包必須要將抓包工具的證書安裝到客戶端本地,並設定信任;HTTPS
資料只是在傳輸時進行了加密,而抓包工具是接收到資料後再重新加密轉發,所以抓包工具抓到的HTTPS
包可以直接看到明文;