使用 Wireshark 調試 HTTP/2 流量

jopen 9年前發布 | 24K 次閱讀 Wireshark 網絡技術

 

我們知道,HTTP/2 引入了二進制分幀層(Binary Framing),將每個請求和響應分割成為更小的幀,并對它們進行了二進制編碼。與此同時,HTTP/2 沿用了之前 HTTP 版本中的絕大部分語義,上層應用基本上感知不到 HTTP/2 的存在,這一點可以通過瀏覽器的網絡調試工具得到驗證。以下是使用 Chrome 訪問 HTTP/2 網站的截圖,網絡面板中顯示的內容與 HTTP/1 網站相比,只有一些細微的區別(頭部字段都是小寫,多了一些冒號開頭的頭部等)。

使用 Wireshark 調試 HTTP/2 流量

那么究竟要如何調試 HTTP/2 流量呢?HTTP/2 中的 Server Push、Prioritization 等功能,要如何才能看到并分析呢?Chrome 本身提供了一個非常不錯的工具,在 Chrome 地址欄輸入chrome://net-internals/#http2即可進入。這個工具會列出瀏覽器當前所有活躍的 HTTP/2 Session,點擊具體的 Session ID,可以看到全部幀信息。

但 Chrome 的工具看到的信息畢竟經過了解析和篩選,不如原始信息全面,也沒辦法在其他瀏覽器例如 Firefox 中使用。本文介紹一個更為通用的 HTTP/2 調試工具:Wireshark。

Wireshark 是一個無比強大的網絡封包分析工具,大家對它應該不陌生。新版 Wireshark 才增加了對 HTTP/2 的支持,首先請從下面這個地址獲取最新的安裝包:

根據自己系統選擇合適的安裝包后,全新或覆蓋安裝都可以。我在寫本文時用的是「Wireshark 2.1.0-229-g3385c29 Intel 64.dmg」這個安裝包。

由于主流瀏覽器都只支持 HTTP/2 Over TLS,也就是說當前 HTTP/2 網站都使用了 HTTPS,數據傳輸都經過了 SSL 加密。所以默認情況下,Wireshark 抓到的包是這樣的,SSL 層之上的協議細節完全看不到:

使用 Wireshark 調試 HTTP/2 流量

另外一個著名的 HTTP 抓包工具 Fiddler 是通過開啟本地代理進行抓包的,它能夠解密 HTTPS 流量的原理很簡單:首先 Fiddler 作為客戶端跟服務端建立 TLS 連接,使用服務端的證書,處理請求和響應;然后 Fiddler 又作為服務端跟瀏覽器建立 TLS 連接,使用 Fiddler 的證書,處理請求和響應。所以 Fiddler 要解密 HTTPS 流量,需要先把它生成的根證書添加到系統受信任的根證書列表之中。

Wireshark 的抓包原理是直接讀取并分析網卡數據,要想讓它解密 HTTPS 流量,有兩個辦法:1)如果你擁有 HTTPS 網站的加密私鑰,可以用來解密這個網站的加密流量;2)某些瀏覽器支持將 TLS 會話中使用的對稱密鑰保存在外部文件中,可供 Wireshark 加密使用。本文重點介紹第二種方法。

Firefox 支持生成上述第二種方式的文件,具體格式見這里: NSS Key Log Format 。但 Firefox 只會在系統環境變量中存在SSLKEYLOGFILE路徑時才會生成它,先來加上這個環境變量(以 OSX 為例):

mkdir ~/tls && touch ~/tls/sslkeylog.log

#zsh
echo "\nexport SSLKEYLOGFILE=~/tls/sslkeylog.log" >> ~/.zshrc && source ~/.zshrc

#bash
echo "\nexport SSLKEYLOGFILE=~/tls/sslkeylog.log" >> ~/.bash_profile && . ~/.bash_profile

接著,在 Wireshark 的 SSL 配置項里將這個文件選上。如下圖:

使用 Wireshark 調試 HTTP/2 流量

通過終端啟動 Firefox(確保能讀取到環境變量):

open /Applications/Firefox.app

這時候,再訪問 HTTPS 網站,Firefox 應該會往sslkeylog.log文件中寫入一些數據。檢查無誤后,就可以開啟 Wireshark,選擇合適的網卡開始抓包了(本文目的是抓取 HTTP/2 數據包,可以將 TCP 端口限定在 443,讓抓到的數據少一些):

使用 Wireshark 調試 HTTP/2 流量

新版 Wireshark 在配置了 TLS 加密后,會自動識別并解析 HTTP/2 流量。通過 Firefox 訪問想要抓包的 HTTP/2 網站,根據 IP 和協議過濾一下,就可以輕松看到想要的 HTTP/2 數據包了。如下圖:

使用 Wireshark 調試 HTTP/2 流量

這種方法也可以用在解密使用 HTTP/1 的 HTTPS 網站上,大家可以自己動手試一試。

本文鏈接: https://imququ.com/post/http2-traffic-in-wireshark.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!