動かざることバグの如し

近づきたいよ 君の理想に

Pythonで簡易HTTPSサーバーを構築する

環境

やりたいこと

Pythonで簡易的なHTTPSサーバーを構築したい

HTTPサーバーなら

❯ python -m http.server -p 8080 
Serving HTTP on :: port 8000 (http://[::]:8000/) ...

と標準コマンドで起動できるが、HTTPSだと自分でコードを実装しなければいけないらしい。

コード

import http.server
import ssl

PORT = 8080

server_address = ("0.0.0.0", PORT)

# SimpleHTTPRequestHandler: カレントディレクトリをドキュメントルートとする簡易ハンドラ
handler = http.server.SimpleHTTPRequestHandler

# HTTPServerインスタンスの生成(ThreadingMixInを使用しないシングルスレッド実装)
httpd = http.server.HTTPServer(server_address, handler)

# TLS 1.2以上を強制するSSLContextの生成(PROTOCOL_TLS_SERVERはPython 3.6+で推奨)
# Python 3.12ではTLS 1.3がデフォルトで有効化される
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)

context.load_cert_chain(certfile="example.crt", keyfile="example.key")

# 既存のソケットをSSL/TLSでラップ(server_side=Trueでサーバーモード)
# この実装ではソケットの再利用(SO_REUSEADDR)が考慮されていない点に注意
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)

print(f"HTTPS Server running on https://0.0.0.0:{PORT}")

httpd.serve_forever()