PythonでのhttpsサーバーとWiresharkによるTLS復号化
もともとはWiresharkで暗号化データを見たいというところからスタートし、そのためには、簡単にhttpsサーバーを構築したい、ついでにPythonにて作成で、、、ということなった。調べると下記内容の単なる組み合わせで済んだが、備忘録として記録に残す。
- Python Tips: Python で https サーバーを動かしたい
- MacOsのWiresharkでHTTPトラフィックを見る方法 How to decode TLS traffic on Wireshark
Pythonでのhttpsサーバー
上述リンク先のコードとほぼ同じ。
import ssl
from http.server import HTTPServer, SimpleHTTPRequestHandler
PORT = 443
CERTFILE = "./oreore.pem"
Handler = SimpleHTTPRequestHandler
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(CERTFILE)
with HTTPServer(("", PORT), Handler) as httpd:
print("serving at address", httpd.server_address, "using cert file", CERTFILE)
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
httpd.serve_forever()
証明書を本ファイルがあるディレクトリの”oreore.pem”としている(オレオレ証明書)。同ディレクトリにあるindex.htmlは下記となっている。
<html>
<h1>Test12345</h1>
</html>
実行する。
% python3 server.py
$ SSLKEYLOGFILE=./key.log /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --user-data-dir=./tmp
”key.log”はWiresharkで利用されるログファイルである(後述)。
WiresharkでTLS復号化
こちらも上述リンクのとおりに実施。
PreferenceのProtocol TLSにて、シークレットログファイル(ここではkey.log)を定める。
検証
アクセス
ループバックアドレス”https://127.0.0.1/”へアクセスする。オレオレ証明書なので下記メッセージが表示されるが、無視して進む。
index.htmlの内容が表示されている。
Wiresharkで取得したデータ
同じキャプチャファイルを、シークレットログファイル指定がある場合とない場合とで比較してみる。ログファイル指定がある場合が下記。
HTTPのコマンドやレスポンスが見えるが、ログファイル指定がない場合が下記となり、それらが見えない。
ポート番号が443であることも確認(下記)。
シークレットログファイル指定がある場合で、シーケンスを表示してみる。ここでは、TLSストリームを選択。
その結果が下記となる。
HTTPの詳細が見える。まずは意図したことは実施できた。
server.pyログ
参考までに、server.pyログを表示。
serving at address ('0.0.0.0', 443) using cert file ./oreore.pem
127.0.0.1 - - [18/May/2024 16:32:23] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [18/May/2024 16:38:33] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [18/May/2024 16:44:36] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [18/May/2024 16:44:36] code 404, message File not found
EOF