Wireshark上にHTTP/2を表示する
こんにちは、M-Yamashitaです。
今回の記事は、WiresharkでHTTP2を表示するための設定についてです。
gRPCを勉強しようと思い調べたところ、gRPCがHTTP/2を使用していることを知りました。HTTP/2がどんなやり取りをしているのか、Wiresharkを使いながら調べていこうとしたところ、設定で色々躓いてしまいました。
そのため、次回同じミスを踏まないように備忘録として残します。
この記事で伝えたいこと
- WiresharkでHTTP/2を表示するための設定
-
SSLKEYLOGFILE
の設定 - 使用するブラウザ
- Wireshark上の設定
-
WiresharkでHTTP2を表示するための設定
SSLKEYLOGFILE
の設定
何も設定せずにWiresharkを起動し、Google Chromeでgoogle.comを開くと、ProtocolカラムにHTTP/2は表示されず、TLSv1.3が表示されます。
表示されない理由として、多くのブラウザが対応しているHTTP/2はTLS上で動作するHTTP/2となっています。TLSは暗号化されているため、Wireshark上ではHTTP/2のやり取りを見ることができないためです。
HTTP/2ではポート番号とは別に、どのような方式で接続を行うかを決めるための「識別子」が定義されている。定義されている識別子は「h2」(HTTP/2 over TLS)と「h2c」(HTTP/2 over TCP)の2つで、h2はTLSで保護されたコネクション上(いわゆるhttps)でHTTP/2を利用することを示し、h2cは暗号化されていないTCPコネクション上(いわゆるhttp)でHTTP/2を利用して通信を行うことを示すものだ。
HTTP/2では規格上はTLSによる暗号化があってもなくても利用できるのだが、TLSを利用するh2にしか対応していないクライアントも多い。特にGoogle ChromeやFirefox、Safari、Internet Explorerといった一般的なWebブラウザはh2cに未対応となっているため、HTTP/2を利用するためには事実上TLSが必須という状況になっている。これは、プライバシ保護などのためにWWWで暗号化通信(HTTPS)を必須とするような動きが進んでいることが背景にある。
Wiresharkのドキュメントを見ると、ログファイルのパスを持つ環境変数SSLKEYLOGFILE
をセットすることで、FirefoxやChromeがシークレット情報をその環境変数のログファイルに書き込むとあります。厳密には、ChromeやFirefoxが持つNSSやOpenSSL、boringsslライブラリが、このログファイルに書き込んでいるようです。
The key log file is a text file generated by applications such as Firefox, Chrome and curl when the SSLKEYLOGFILE environment variable is set. To be precise, their underlying library (NSS, OpenSSL or boringssl) writes the required per-session secrets to a file.
そのため、シークレット情報の出力先であるログファイルを作成します。今回は/Users/xxx/Documents/sslkeylog.log
に作成しました。
なお、後述する起動したブラウザの権限と、作成したログファイルのパーミッションが合わないことがあるため、作成したファイルの書き込み権限を追加しておきます。
❯ chmod 666 ~/Documents/sslkeylog.log
❯ ls -l ~/Documents
total 0
-rw-rw-rw- 1 xxx admin 0 Feb 24 06:58 sslkeylog.log
次に、環境変数のSSLKEYLOGFILE
に、先程のログファイルのパスを指定します。
❯ export SSLKEYLOGFILE=$HOME/Documents/sslkeylog.log
これでSSLKEYLOGFILE
の設定は完了です。
使用するブラウザ
ログファイルへシークレット情報を出力する場合、通常のGoogle ChromeやFirefoxを使っても出力されません。開発者向けのブラウザを使用する必要があります。
そのため、Google Chrome CanaryやFirefox Developer Editionを使用します。
また、ブラウザの起動方法として、先程の環境変数が有効の状態で起動する必要があるため、環境変数をセットしたターミナル上でコマンドを使って実行します。Google Chrome Canaryを使う場合は以下のコマンドになります。
❯ open -n /Applications/Google\ Chrome\ Canary.app
起動後、google.comなどのHTTP/2に対応したページを開くと、ログファイルにシークレット情報が書き込まれます。
ログファイル例:
❯ less ~/Documents/sslkeylog.log
CLIENT_HANDSHAKE_TRAFFIC_SECRET xxxxx
SERVER_HANDSHAKE_TRAFFIC_SECRET xxxxx
・・・
書き込まれない場合は、ターミナルやPCの再起動により書き込まれることがあります。
Wireshark上の設定
Wiresharkを開き、Preferences画面の左サイドメニューにあるProtocolsからTLSを選択します。(Pre)-Master-Secret log filenameに、環境変数SSLKEYLOGFILE
のパスを指定します。
次にブラウザを、上記の"使用するブラウザ"項目で記載した方法で起動します。HTTP/2に対応したページを開くと、以下画像のように、HTTP/2の通信が確認できます。
おわりに
今回はWiresharkでHTTP/2を表示するための設定の話をしました。
記事執筆の最中、設定だけの話にとどまらず、HTTP/2の仕組みやログファイルの書き込みはどのライブラリが担当しているのかも確認でき、知識を増やすことができました。
この記事が誰かのお役に立てれば幸いです。
Discussion