稀に TLS で暗号化されたパケットの中身を確認したくなる時があるけど、Change Cipher Spec のあとは暗号化されていて困る。TLS はそういうんもんなので普段は困らないけど、handshake の様子とかをつぶらに確認したくなる時とかに途方に暮れたりする。
こういう時は handshake 中の pre master secret などと呼ばれる暗号化に使っている鍵をどうにかして知る必要がある。
で、だいたいのプログラムには通信に使用した秘密を保存することができる。ググったり、help を眺めると書いてあるけど、よく忘れるのでメモっておく。
curl
の場合は環境変数に pre master secret の保存先を以下のように指定する。
SSLKEYLOGFILE=./pre-master-secret.log curl -I https://nabeop.hatenablog.com/
openssl
の s_client
の場合はオプションに pre master secret の保存先を以下のように指定する。
openssl s_client -servername nabeop.hatenablog.com -connect nabeop.hatenablog.com:443 -keylogfile=pre-master-secret.log < /dev/null
あとは wireshark なり tshark でゲットした pre master secret をキャプチャしたデータにくわせると、複合された状態でデータを眺めることができる。