😺
OpenSSL s_clientのQUIC通信を復号する
アイドルタイムアウト値を調べるために、TLSハンドシェイクのみ行うテストをOpenSSL s_clientで行ったのですが、QUICの場合、15秒毎にクライアントからパケットを送っていました。
これは何だろう?暗号化されてフレームの内容が見えない!という事でパケットを復号する方法を探し、無事復号出来ましたので、その手順を記載します。
OS : Ubuntu 24.04.1
OpenSSL : openssl-3.3.2
sslkeylogfile生成ツール : openssl-keylog
OpenSSL 3.3.2のインストール
- Ubuntuのアップデート
apt-get update
apt-get upgrade
- 開発ツールのインストール
apt install build-essential checkinstall zlib1g-dev
- 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
- ライブラリをパスにセット
vi ~/.bashrc
以下を最後の行に追加
export LD_LIBRARY_PATH=/usr/local/lib64
読み込み
source ~/.bashrc
- 動作確認
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