【初心者向け】Wireshark(パケットキャプチャ)で暗号化されたTLS/HTTPS通信を復号化する方法 | TLS1.3対応

はじめに

ネットワークやインフラに携わる方であれば、Wiresharkを使ったパケットキャプチャで通信を解析する機会は少なくありません。特にTLS1.3で暗号化されたHTTPS通信は、従来より解析が難しくなっているため、復号化の方法を理解しておくことが重要です。本記事では、Wiresharkを用いてTLS1.3通信を復号化する手順をわかりやすく解説しますので、ぜひ参考にしてください。

WiresharkによるHTTPS通信のキャプチャ

暗号化された通信を確認する

TLS で暗号化された通信がどのように見えるのか、実際に確認してみましょう。
Wiresharkを起動してパケットキャプチャを開始し、ブラウザから任意のWebサイトにアクセスします。ここでは例として、自身のPCの Google Chrome からITインフラエンジニア向けスキルアップクイズにアクセスしたときのキャプチャ結果を示します。

特定のWebサイトとの通信だけを表示するために、次のフィルタを適用しました。

ip.addr == XX.XX.XX.XX

キャプチャ結果を見ると、通信の多くが「Application Data」として表示され、中身が暗号化されていることが分かります。つまり、TLS 通信では実際のリクエストやレスポンスの内容をそのまま読み取ることはできません。

復号化に必要な鍵情報の取得

TLS1.3通信をWiresharkで復号化するには、クライアントとサーバ間でやり取りされるセッション鍵(一時鍵)が必要です。TLS1.3では、セッションごとに一度共有した鍵を破棄し、毎回新しい鍵を使用します。これにより、サーバの秘密鍵が漏洩しても過去の通信の秘匿性が保たれる設計になっています。この仕組みを前方秘匿性(PFS: Perfect Forward Secrecy)と呼びます。

それでは、復号化に必要なセッション鍵情報を取得する手順をご紹介します。まず、PowerShell を起動し、環境変数を一時的に設定します、その後、PowerShell上でコマンドを実行してGoogle Chrome を起動してください。

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

PS C:\Users\username> $env:SSLKEYLOGFILE = "$env:USERPROFILE\Desktop\sslkeys.log"
PS C:\Users\username> & "C:\Program Files\Google\Chrome\Application\chrome.exe"

続いて、Wireshark でパケットキャプチャを開始し、ブラウザから Web サイトにアクセスしてみましょう。上記で指定したパスにsslkey.logファイルが出力されます。

それではsslkey.logの中身を見てみましょう。下記の通り鍵情報が大量に出力されます。これらの鍵を Wiresharkに読み込ませることで、通信を復号できます。

sslkey.log
—————————————————————————
CLIENT_HANDSHAKE_TRAFFIC_SECRET c48725e85c80e440ab4fdee7127baecada2fb879a49f754c95553bfd564efa55 f41cd91ed0989c931cd76ca4394b4b27f8a9b8b70ad276b3602c49c9f7fd8751
SERVER_HANDSHAKE_TRAFFIC_SECRET c48725e85c80e440ab4fdee7127baecada2fb879a49f754c95553bfd564efa55 63e872609deeccc889fa09ad9ebd49338a86fffa34b239b63fd0264a4357f2d3
CLIENT_TRAFFIC_SECRET_0 c48725e85c80e440ab4fdee7127baecada2fb879a49f754c95553bfd564efa55 9bed430f2121fc594512c8d0b0b32ec10f5c8981c49d72583b82db9e23e9be6d
SERVER_TRAFFIC_SECRET_0 c48725e85c80e440ab4fdee7127baecada2fb879a49f754c95553bfd564efa55 ee98d666042d28dc377ed7dd91586bd249fc60b9c58cbd46ce670a2c98516c85
EXPORTER_SECRET c48725e85c80e440ab4fdee7127baecada2fb879a49f754c95553bfd564efa55 83ff4aab48ea6af43244d1b96012cbd4cb997f8702f86fa4892840a12d5364b8
  • CLIENT_HANDSHAKE_TRAFFIC_SECRET
    ハンドシェイク時にクライアントが送信するデータを暗号化するための鍵
  • SERVER_HANDSHAKE_TRAFFIC_SECRET
    ハンドシェイク時にサーバが送信するデータを暗号化するための鍵
  • CLIENT_TRAFFIC_SECRET_0
    ハンドシェイク完了後、クライアントから送信するアプリケーションデータ (HTTP リクエストなど)暗号化する鍵
    ※再鍵交換が発生すると、CLIENT_TRAFFIC_SECRET_1, _2 … と更新される
  • SERVER_TRAFFIC_SECRET_0
    ハンドシェイク完了後、サーバから送信するアプリケーションデータ (HTTPレスポンスなど)暗号化する鍵
    ※再鍵交換が発生すると、SERVER_TRAFFIC_SECRET_1, _2 … と更新される

復号化した通信の確認方法

Wiresharkにセッション鍵を指定していきます。
「Edit」→「Preference」を押下します。

Protocolを展開します。

「TLS」を選択します。
(Pre)-Master-Secret log filenameにセッション鍵を指定します。「Browse」を押下して、先ほど出力させたセッション鍵を指定してください。

ファイルを指定できたら「Apply」を押下します。

以上で設定は完了です。最後に復号化できているかどうかを確認してみましょう。

先ほどはLength Infoの表示が「Application Data」となっており、通信内容が暗号化されていました。
一方、今回は「GET /quiz/public HTTP/1.1」と表示されており、GETリクエストが送信されていることを確認できます。

さいごに

Wireshark を使った TLS 通信の復号化についての説明は以上です。特にTLS 1.3 ではハンドシェイクの一部が暗号化されるようになったため、これまで以上に復号化して通信エラーを解析する場面が増える可能性があります。その際に慌てず対応できるよう、事前に Wireshark を使ったトラブルシューティングの方法をマスターしておきましょう。

参考資料

TLS – Wireshark Wiki
How to decrypt TLS traffic in Wireshark

コメント