こんにちは!今回は、Dockerコンテナ環境でローカルホストをHTTPS化する方法について詳しく解説していきます。
目的 :
ローカルホストをhttps化したい (例: localhost:8080 -> https://localhost:8080)
前提
- ホストマシンはWindows10
- コンテナはDocker Desktopで作成している
Contents
ローカル開発でHTTPS化するメリット
開発環境でHTTPSを使用したいケースは多々あります。例えば:
- PWAの開発
- セキュアなAPIのテスト
- 本番環境に近い開発環境の構築
今回は、Docker環境でApacheを使用したHTTPS化の方法を紹介します。
HTTPS化手順の概要と予備知識
- OpenSSL で自己著名SSL証明書の作成
- Docker コンテナで証明書の設定
- ブラウザでの証明書の信頼設定
自己署名証明書とは
自己署名証明書とは、認証局(CA)を介さずに自分自身で作成・署名したSSL/TLS証明書のことです。
- 証明書の即時発行が可能
- コストがかからない
- 更新・再発行が容易
証明書の内容
データの暗号化
- 通信内容を暗号化
- パスワードやクレジットカード情報を安全に送信可能
改ざん防止
- データが途中で変更されていないことを保証
- 安全な通信を実現
OpenSSLとは
opensslコマンドは、ターミナルから直接実行できる暗号化関連のツールです。
主な用途は:
- 証明書の作成と管理
- 暗号鍵の生成
- ファイルの暗号化と復号化
- 証明書や鍵の内容確認
コマンドラインツール以外にもプログラミング言語でライブラリとして機能を利用することも可能です
自己署名証明書の作成
OpenSSLコマンドを使用して、自己署名証明書を作成します。
Windowsでopensslコマンドを使用する方法
opensslコマンドで自己署名SSL証明書を作成します。以下のコマンドを使用します:
openssl req -x509 -nodes -newkey rsa:2048 -addext "subjectAltName = DNS:localhost" -keyout localhost+2-key.key -out localhost+2.crt
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout ssl/server.key -out ssl/server.crt \
-subj "/CN=localhost" \
-addext "subjectAltName = DNS:localhost,IP:127.0.0.1"
このコマンドを実行すると、対話形式で以下の情報を入力できます:
Country Name (国名): JP
State (都道府県): Tokyo
Locality (市区町村): Tokyo
Organization Name (組織名)
Organizational Unit Name (部門名)
Common Name: localhost
Email Address (メールアドレス)
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Shinjuku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:
このコマンドで以下のファイルが生成されます:
- server.key: 秘密鍵
- server.crt: 証明書
- 作業したいフォルダで右クリック
- 「Open Git Bash here」を選択
Apacheの設定
Apache設定ファイル(apache\ssl.conf)でSSL関連の設定
<VirtualHost *:443>
ServerName localhost
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/server.crt
SSLCertificateKeyFile /etc/apache2/ssl/server.key
<Directory /var/www/html>
Require all granted
</Directory>
</VirtualHost>
DockerfileをApache公式イメージをベースに作成
FROM php:8.2-apache
WORKDIR /var/www/html
COPY . /var/www/html/
COPY apache/ssl.conf /etc/apache2/sites-available/
RUN chown -R www-data:www-data /var/www/html && \
a2enmod ssl && \
a2ensite ssl.conf
docker-compose
下記の設定により、自己署名証明書を使用したHTTPS接続が可能になります。
- SSL moduleの有効化(a2enmod ssl)
- SSL設定の有効化(a2ensite ssl.conf)
- 証明書ファイルの適切なマウント
- Apache設定の再読み込み
services:
web:
build: .
ports:
- "8080:80"
- "443:443"
volumes:
- .:/var/www/html
- ./ssl:/etc/apache2/ssl
- ./apache/ssl.conf:/etc/apache2/sites-available/ssl.conf
environment:
- TZ=Asia/Tokyo
Apacheの設定では、以下のモジュールを有効化する必要があります:
- ssl_module
- socache_shmcb_module
ブラウザでの証明書の信頼設定(NET::ERR_CERT_AUTHORITY_INVALID 解決策)
自己署名証明書を使用すると、ブラウザでNET::ERR_CERT_AUTHORITY_INVALID
エラーが表示されます。これを解決するには:
- 証明書ファイル(.crt)をダブルクリック
- 「証明書のインストール」をクリック
- 「ローカルコンピューター」を選択

- 「信頼されたルート証明機関」を選択
- インストールを完了

これにより、ブラウザが証明書を信頼するようになります。
詳細を説明すると、自己証明書は初期状態では信頼されないので下記の手順が必要です
「信頼されたルート証明機関ストアに配置」
- ブラウザはストアを信頼の起点として使用
- このストアにある証明書は無条件に信頼される
- 自己署名証明書を直接ここに配置することで、強制的に信頼させる
自動選択で配置する場合
- 通常の証明書用のストア(個人、中間証明書など)に配置される可能性
- それらのストアに配置された証明書は信頼チェーンが必要
キュリティに関する注意点
- 自己署名証明書は開発環境専用です
- 本番環境では必ず信頼された認証局から証明書を取得してください
- 証明書と秘密鍵の取り扱いには十分注意が必要です
まとめ
ローカル開発環境でHTTPSを使用することで、本番環境に近い開発が可能になります。ただし、自己署名証明書の使用は開発環境に限定し、本番環境では適切な証明書を使用することを忘れないようにしましょう。
Happy Coding! 🚀