😺

OpenSSL s_clientのQUIC通信を復号する

2024/09/08に公開

アイドルタイムアウト値を調べるために、TLSハンドシェイクのみ行うテストをOpenSSL s_clientで行ったのですが、QUICの場合、15秒毎にクライアントからパケットを送っていました。
これは何だろう?暗号化されてフレームの内容が見えない!という事でパケットを復号する方法を探し、無事復号出来ましたので、その手順を記載します。

OS : Ubuntu 24.04.1
OpenSSL : openssl-3.3.2
sslkeylogfile生成ツール : openssl-keylog

OpenSSL 3.3.2のインストール

  1. Ubuntuのアップデート
apt-get update
apt-get upgrade
  1. 開発ツールのインストール
apt install build-essential checkinstall zlib1g-dev
  1. OpenSSLのインストール
    例として、/home/opensslにインストールします。
    OpenSSLのダウンロード及び解凍
cd /home/openssl
wget https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz
tar zxvf openssl-3.3.2.tar.gz
cd openssl-3.3.2
./config
make
make install
  1. ライブラリをパスにセット
vi ~/.bashrc
以下を最後の行に追加
export LD_LIBRARY_PATH=/usr/local/lib64
読み込み
source ~/.bashrc
  1. 動作確認
openssl version
OpenSSL 3.3.2 3 Sep 2024 (Library: OpenSSL 3.3.2 3 Sep 2024)

openssl-keylogのインストール
openssl-keylogの手順に沿って、/homeにインストールします。

cd /home
sudo apt install git build-essential
git clone https://github.com/wpbrown/openssl-keylog
cd openssl-keylog
make
export PATH=/home/openssl-keylog:$PATH

Wiresharkのインストール

apt install wireshark

パケットキャプチャの実行
インストールが完了したので、実際にパケットキャプチャを行います。sslkeylogfileとキャプチャファイルは、/tmpに作成されます。

パスを通していない場合は、以下を実行
export PATH=/home/openssl-keylog:$PATH

キャプチャコマンドを実行
dumpcapssl ens160 openssl s_client -quic -alpn h3 -connect www.google.com:443
(ens160は実際の環境のNIC名に変更してください)

CTRL + Cで終了
^C*** Command Interrupted ***
*** Command Stopped ***
*** Stopping Capture ***
*** Merging Key Files ***
*** Embedding Keys ***
*** Stopped Capture : /tmp/dumpcapssl-0qs2RVlJ.pcapng Keys: /tmp/dumpcapssl-0qs2RVlJ.keys ***

tmpから作成されたファイルを取得し、Wiresharkでsslkeylogfileを指定してファイルを読み込みこむと、QUICのパケットのフレーム内容を確認出来ます。

クライアントは15秒事に何かパケットを送っていますが、何のパケットなのか分かりません。

sslkeylogfileをセットします。
Edit-> Preferences -> Protocols-> TLS

クライアントから送っているのは、Pingフレームでした!

Discussion