本文來自網易雲社區
之前有介紹《wireshark抓包分析——TCP/IP協議》,然后某天有人問我,示例里是HTTP的,如果是HTTPS,你可以抓包分析嗎?基於好奇,我查閱了下相關資料,把一些淺見分享給大家。在講HTTPS的解密之前先來看下HTTPS與HTTP的不同之處,HTTPS是在TCP/IP與HTTP之間,增加一個安全傳輸層協議,而這個安全傳輸層協議一般用SSL或TLS,類似於下圖。即HTTPS=HTTP+SSL/TLS。

SSL協議分為SSL記錄協議層和SSL握手協議層。SSL握手協議建立在SSL記錄協議之上,用於在實際的數據傳輸開始前,通訊雙方進行身份認證、協商加密算法、交換加密密鑰等。SSL記錄協議將數據塊進行拆分壓縮,計算消息驗證碼,加密,封裝記錄頭然后進行傳輸。如下圖顯示,這里不展開,有興趣的童鞋可以繼續深入了解。
應用層協議 |
SSL握手協議 |
SSL記錄協議 |
TCP |
IP |
先回顧下Wireshark對HTTP請求分析,一般是通過選定數據右鍵鼠標,查看Follow TCP Stream。

即可以看到請求的詳細內容了。

下面來看看Wireshark對HTTPS請求數據是如何分析的。先抓包看下,以訪問CSDN首頁為例,可以看到抓取的數據包如下:

根據截圖會發現2個略“神奇”的東東,(1)雖然過濾條件設置了SSL,但過濾結果滿屏都是TLS的身影,隨機找了其他一些網站進行抓包也都是TLS。查閱了下資料,發現TLS是以建立在SSL V3.0的基礎上,兩者的加密算法和MAC算法都不一樣,而協議本身差異性不大。TLS協議也是由兩層組成: TLS 記錄協議(TLS Record)和 TLS 握手協議(TLS Handshake)。較低的層為 TLS 記錄協議。忽略協議的差異性,后面就拿TLS來解密分析。現在來看另外1個滿屏滿眼的東東。(2)好多hello呀,Client Hello和Server Hello好多,這是什么呢?這是TLS的握手。整個握手階段如下,可分為5步。
第一步,瀏覽器給出協議版本號、一個客戶端生成的隨機數,以及客戶端支持的加密方法。
第二步,服務器確認雙方使用的加密方法,使用的tls版本號和一個隨機數。
第三部,並給出數字證書、以及一個服務器運行Diffie-Hellman算法生成的參數,比如pubkey。
第四部,瀏覽器獲取服務器發來的pubkey,計算出另一個pubkey,發給服務器。
第五部,服務器發給瀏覽器一個session ticket。

具體握手過程可以通過Wireshark的抓包一步步驗證,這里不再詳述,還是專心來看看如何使用Wireshark來進行數據解密。我們現在獲取到的Wireshark抓包數據在握手完成之后,還是各種TLSv1.2的東東,都是加密后的數據。

解密方式介紹我覺得最簡單的,通過瀏覽器保存的TLS 會話中使用的對稱密鑰來進行數據解密。在瀏覽器接收到數據之后,會使用秘鑰對數據進行解密,部分瀏覽器會在某個地方會存儲這個密鑰,我們只要獲取瀏覽器中的會話密鑰就能解密數據。以windows系統+Chrome瀏覽器為例,首先要導出瀏覽器存儲的密鑰,通過 計算機屬性——高級系統設置——環境變量,新建一個變量名“SSLKEYLOGFILE”的變量,變量值是導出的密鑰具體文件地址。

設置后可以通過Chrome瀏覽器打開任意一個HTTPS網址,此時查看變量值對應路徑,已經生成sslkey.log。

密鑰成功導出到本地啦。現在可以將密鑰應用到Wireshark了。具體路徑如下:菜單欄Edit——Preferences——Protocols——SSL(注意,不論是SSL還是TLS這里都是SSL,沒有單獨的TLS選項),在(Pre)-Master-Secret log filename中選擇剛才設置的變量值。

配置完成,看下效果:

看到有HTTP了,之前都是TLSv1.2。同時,WireShark下面會有一個“Decrypted SSL data”即已解密的SSL Data的標簽,點擊之后你就可以如上圖所示的看到已經解密的TLS數據包的信息了。
覺得這樣太難看了?OK,也可以像HTTP一樣,通過鼠標右鍵在菜單欄中選擇“Follow SSL Stream”,查看完整的HTTPS解密之后的請求數據哦。


除此之外,上面還有很多TLSv1.2的東東,比如:client_key_exchange、Session Ticket,這是最初提到過的TLS握手過程的第四步和第五步,並不是請求數據包的內容,因此看到其中像是沒有解密的內容也不要奇怪哦。

網易雲新用戶大禮包:https://www.163yun.com/gift
本文來自網易實踐者社區,經作者李莉授權發布。
相關文章:
【推薦】 Lily-一個埋點管理工具
