はじめに
ローカル開発でPythonの標準機能である http.server を使ってサーバを立ててデバッグすることがあります。
今回、HTTPS接続の確認が必要となったため、自分の備忘録も兼ねてローカルHTTPSサーバの構築手順をまとめます。
同じようなニーズがある方の参考にもなれば幸いです。
自己証明書の作成
HTTPSサーバを立てるには、SSL証明書と秘密鍵が必要です。
ここではOpenSSLを使って自己署名証明書を作成します。
OpenSSLによる証明書・秘密鍵の作成
以下のコマンドをターミナルで実行してください。
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=localhost"
key.pem(秘密鍵)と cert.pem(証明書)がカレントディレクトリに生成されます。
コモンネーム(CN)は「localhost」に指定しています。
より簡単に信頼されたローカル証明書を作成したい場合は、mkcertも便利です。
mkcert localhost で証明書と鍵が作成できます。
起動スクリプトと起動方法
Pythonスクリプト
作成した証明書と秘密鍵を利用し、PythonでHTTPSサーバを構築するためのコードです。
from http.server import HTTPServer, SimpleHTTPRequestHandler
import ssl
server_address = ('localhost', 8000)
httpd = HTTPServer(server_address, SimpleHTTPRequestHandler)
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.load_cert_chain(certfile='cert.pem', keyfile='key.pem')
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
print("Serving HTTPS on https://localhost:8000")
httpd.serve_forever()
上記コードは、Python 3.12以降にも対応したコードです。
Python 3.11以前でよく使われていた ssl.wrap_socket() は、Python 3.7で非推奨(DeprecationWarning)となり、Python 3.12で完全に削除されました
mkcertで作成した証明書を使う場合は、ファイル名が異なるため、コード上のパスを適宜変更してください
サーバの起動方法
証明書と秘密鍵(cert.pem, key.pem)が同じディレクトリにあることを確認
以下のコマンドで起動
python https_server.py
ブラウザで https://localhost:8000 にアクセスすると、HTTPSでローカルサーバに接続できます。
なお、スクリプトを起動したディレクトリを公開ディレクトリとして扱うため、起動時のカレントディレクトリ内のファイルやフォルダがそのままブラウザから参照可能です。
自己署名証明書を利用しているため、ブラウザでアクセスすると「安全ではありません」などの警告が表示されます。
ローカル開発用途であれば問題ありませんが、本番環境では必ず信頼された認証局発行の証明書を利用してください。
警告を無視して進む場合は、「詳細」→「localhostにアクセスする(安全ではありません)」などを選択します。
まとめ
- OpenSSLで自己署名証明書を作成
- Python標準ライブラリでHTTPSサーバを簡単に構築可能
- 開発用途なら自己署名証明書でも十分
- ブラウザ警告やファイルパスのミスに注意
ローカルでHTTPSサーバが必要になったときの参考用メモとして。
同じようなケースで困っている方にも役立ててもらえればと思います。