ローカル開発環境を構築していて、「HTTPS通信やSecure WebSocket(WSS)を使いたいけれど、SSL証明書の設定が面倒…」と感じたことはありませんか?
ブラウザの「保護されていない通信」という警告を無視して進めることもできますが、一部のAPIや機能(Service Workerや位置情報など)はHTTPSが必須な場合もあります。
そこで今回は、現在のデファクトスタンダードとも言えるツール 「mkcert」 を使って、Docker環境に信頼されたSSL証明書を導入する手順をステップバイステップでご紹介します。
1. なぜ「mkcert」なのか?
これまで一般的だった openssl による自己署名証明書は、ブラウザに「このサイトは危険です」と怒られるため、手動で例外許可を出す必要がありました。
mkcert を使うと、自分のPC内に「ローカル認証局(CA)」を作成し、そこから証明書を発行します。これにより、ブラウザが最初から「安全なサイト」として認めてくれる(緑の鍵マークが出る) のが最大のメリットです。
2. mkcert のインストールと準備
まずはホストマシン(Mac/Windows/Linux)に mkcert をインストールしましょう。
# macOSの場合
brew install mkcert
brew install nss # Firefoxを使う場合
# ローカルCAをPCにインストール
mkcert -install
次に、プロジェクトのルートディレクトリで証明書を発行します。
mkcert localhost 127.0.0.1 ::1
これで、localhost+2.pem(証明書)と localhost+2-key.pem(秘密鍵)が生成されます。
3. docker-compose.yml でのマウント
生成した証明書をコンテナ内のWebサーバー(Nginxなど)から参照できるように設定します。
services:
nginx:
image: nginx:latest
ports:
- "443:443"
volumes:
- ./localhost+2.pem:/etc/nginx/ssl/cert.pem
- ./localhost+2-key.pem:/etc/nginx/ssl/key.pem
- ./nginx.conf:/etc/nginx/conf.d/default.conf
4. Nginx の設定(SSL終端)
Nginx側でSSLの設定を記述します。リバースプロキシとして構成すれば、バックエンドのアプリ側はHTTPのままでも、外部(ブラウザ)からはHTTPSとして通信可能です。
server {
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
location / {
proxy_pass http://app_container:8000;
proxy_set_header Host $host;
}
# WebSocket (WSS) の対応
location /ws/ {
proxy_pass http://app_container:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
5. ソケット通信(WSS)の注意点
WebSocketで wss://localhost を使う場合も、上記のように Upgrade ヘッダーと Connection ヘッダーを適切に渡す設定が必要です。これにより、ブラウザ側からは安全なソケット通信として確立されます。
まとめ
DockerでWebアプリやWebSocket(WSS)を開発する際、避けて通れないのがSSL証明書の問題です。自己署名証明書(いわゆるオレオレ証明書)ではブラウザの警告が煩わしく、検証がスムーズに進まないことも。本記事では、ローカル認証局を簡単に構築できる「mkcert」を活用したスマートな解決策を解説します。証明書の発行からdocker-composeでのマウント、Nginxの設定まで、開発効率を劇的に上げる手順をまとめました。
「まだオレオレ証明書で消耗している」という方は、ぜひこの機会に mkcert + Docker の構成を試してみてください!

コメント