皆さん良いWEBライフ送れていますか?
今回はいつも困るローカルでのSSL環境構築です。
内容を見ていただけたらわかりますが、基本mkcertに頼りっぱなしになっています。一度mkcertで設定してしまえば、opensslコマンドで証明書を作る際に面倒なオレオレ認証局署名やSSL証明書自体のインストールの手間が省けるので、今の所採用しています。
目次
- コード全貌
- ファイル構成
- docker-compose.yml
- ssl.conf
- 手順
- 解説
- docker-compose.yml
- ssl.conf
- まとめ
1. コード全般
1-1. ファイル構成
project-root:
- docker-compose.yml
docker:
- ssl.conf
ssl:
- example.com-key.pem
- example.com.pem
public:
- index.html
1-2. docker-compose.yml
version: '3'
services:
web:
image: nginx:latest
container_name: 'ssl_web'
ports:
- '4430:443'
volumes:
- ./docker/ssl:/etc/nginx/ssl
- ./docker/ssl.conf:/etc/nginx/conf.d/default.conf
- ./public:/var/www/html
1-3 ssl.conf
server {
listen 443 ssl;
server_name localhost;
root /var/www/html;
index index.html;
ssl_certificate /etc/nginx/ssl/example.com.pem; # SSL証明書
ssl_certificate_key /etc/nginx/ssl/example.com-key.pem; # 秘密鍵
}
※ 証明書のファイル名は適宜変更してください
2. 手順
brew install mkcert
mkcert -install
cd project-root/docker/ssl
# ここで証明書ファイルを作っています。
mkcert example.com
cd ../../
docker-compose up -d
アクセス方法
- PCの場合:
https://127.0.0.1:4330
- スマホの場合:
https://{ifconfigなどで表示されたローカルIP}:4330
※ localhostだとdockerがうまく解釈できないのでIP指定にしています。
3. 解説
3-1. docker-compose.yml
image: nginx:latest
confがnginxのフォーマットなのでnginxにしていますが、confさえWEBサーバーにあったものを書ければapacheでも動くと思います。
ports:
- '4430:443'
自分でも理解しきれていませんがハマったポイントです。
443:443
といったlocalhostの443ポートをdockerの443ポートに繋げる記述でも動くと思っていましたが、4430:443
とlocalhost側のポートは通常のSSLポートと変えてあげる必要があるようです。
volumes:
- ./docker/ssl:/etc/nginx/ssl
- ./docker/ssl.conf:/etc/nginx/conf.d/default.conf
- ./public:/var/www/html
ローカルのディレクトリ、ファイルをdockerにマウントしています。
- ./docker/ssl:/etc/nginx/ssl
sslディレクトリに関しては証明書ファイルをマウントしているだけです。
- ./docker/ssl.conf:/etc/nginx/conf.d/default.conf
ssl.confはnginxイメージのデフォルトの設定ファイルを上書きする設定にしています。default.confを指定して上書きしないとややこしかったのでこうしています。
- ./public:/var/www/html
publicディレクトリ以下のhtmlファイルなどをnginxのドキュメントルート以下にマウントしています。
nginxのデフォルトルートのままだと、index.htmlがすでに存在していてシンプルにマウント出来なかったので、あえて別ディレクトリをドキュメントルートに設定しています。
3-2. ssl.conf
ssl_certificate /etc/nginx/ssl/example.com.pem; # SSL証明書
ssl_certificate_key /etc/nginx/ssl/example.com-key.pem; # 秘密鍵
特に解説することもないですが、上記でdockerにマウントした証明書や鍵を読み込んでいます。
4. まとめ
mkcertを使うことでとても簡易にSSL環境が構築できると思います。
dockerで出来るというのも環境を汚さなくて良いですね。
良いWEBライフを!