TLSの復号に用いる SSLKEYLOGFILE のフォーマット提案仕様

QUICやTLS通信のデバッグを行うために、TLS実装が通信に用いたシークレットをファイルに出力することがあります。多くの実装は SSLKEYLOGFILE という形式で出力することが一般的になっています。このファイルをWiresharkなどに食べさせることで該当通信の復号が行なえます。

たとえば、QUICは以前書いた手順で復号できます。
asnokaze.hatenablog.com


SSLKEYLOGFILE のファイル形式は、NSSのドキュメント(URL)で見ることが出来ますが

ちゃんと SSLKEYLOGFILE を仕様化するために「The SSLKEYLOGFILE Format for TLS」という提案がIETFに提出されています。

SSLKEYLOGFILEの中身

例えば OpenSSLでSSLKEYLOGFILE を出力すると次のとおりになる

# SSL/TLS secrets log file, generated by OpenSSL
SERVER_HANDSHAKE_TRAFFIC_SECRET 24878b76381f03203d3c4772bf51c49c5786c7adcf7d8fdd644460d5deafd6d5 b48d1fdc6b10b6f4765456e8407649b25971f3384e63461bdacab59c2488cacb8bb7dcde0aa1e2c6ede9390b568624f4
EXPORTER_SECRET 24878b76381f03203d3c4772bf51c49c5786c7adcf7d8fdd644460d5deafd6d5 b56d696bd2fc3ef533dea35a6f907586cbbd7d049fd027d9964d3b924435ea157bfc955a55ef1d6ea7d5012ea906dee3
SERVER_TRAFFIC_SECRET_0 24878b76381f03203d3c4772bf51c49c5786c7adcf7d8fdd644460d5deafd6d5 4676aa104c6ac82822f4450c5a8d3990f70b64005bed05e50a9586e4cd2a6c0187fec0220a83ed21e69eb61fd9e9cfaf
CLIENT_HANDSHAKE_TRAFFIC_SECRET 24878b76381f03203d3c4772bf51c49c5786c7adcf7d8fdd644460d5deafd6d5 6ef4d40e4103a2aa00c985a5287314048fdaddd781f7ee90a2b98513efef6fde04a00950721660ba9e5afb184fbafc70
CLIENT_TRAFFIC_SECRET_0 24878b76381f03203d3c4772bf51c49c5786c7adcf7d8fdd644460d5deafd6d5 8408e4b76dfcb3850eea590c8be1a0fb42a5c63f85246b1b6b16661241670f19c0a511b3d683d5bafc650e89efc04890

#で始まる行はコメント行である。

各行の意味

各行は、スペース区切りで「label」「client_random」「secret」の3つが記述される。

  • label: シークレットのタイプを示す識別子
  • client_random: ClientHelloのランダムの値。これによりどのコネクションのシークレットかわかるようになっている。
  • secret: シークレット値
ラベルの種類

TLS1.3で使うlabelは次の種類がある

  • CLIENT_EARLY_TRAFFIC_SECRET: early dataに用いたシークレット
  • EARLY_EXPORTER_MASTER_SECRET: early exportersに用いたシークレット
  • CLIENT_HANDSHAKE_TRAFFIC_SECRET: クライアントが送った handshake レコードに用いたシークレット
  • SERVER_HANDSHAKE_TRAFFIC_SECRET: サーバが送った handshake レコードに用いたシークレット
  • CLIENT_TRAFFIC_SECRET_0: クライアントがapplication_data レコードに用いたシークレット。(数字はKey Updateにより増える)
  • SERVER_TRAFFIC_SECRET_0: サーバがapplication_data レコードに用いたシークレット。(数字はKey Updateにより増える)
  • EXPORTER_SECRET: exportersに用いたシークレット