ローカルのDockerでHTTPS(SSL)対応しました。
dockerでPHPを動かしている環境です。Laravelでもローカル環境でHTTPS通信することが可能です。
とあるライブラリを使用するときにHTTPS(SSL)にする必要があり調べてみました。
すると、mkcertを使用することでローカルのHTTPS化が可能でした。
この記事では下記を解説しています。
・mkcertで証明書の作成
・HTTPSなDocker(PHP)環境の構築
試してみた環境は下記です。
nginx : lastest
PHP: 7.4-fpm
お急ぎの方は、HTTPS(SSL)対応したDockerを公開していますので、こちらのgithubのブランチをご確認ください。
codelike_web_dockerのsslブランチで対応してみました。
証明書は入れてないので、mkcert作成して上書きすれば使えると思います。
mkcertをインストールする
brewコマンドでinstallします。
brew install mkcert
mkcertで証明書を作成する
mkcertコマンドを使用して、証明書を作成します。
mkcert -installを使っているパソコンで一度実行する必要があるようです。
mkcert -install
localhostと127.0.0.1
の名前に対応した証明書を作ります。
mkcert localhost 127.0.0.1
コマンドを実行すると、下記の証明書が作成されます。
・localhost+1-key.pem
・localhost+1.pem
作成したファイルをdockerで管理している任意の場所に移動します。
今回はcodelike_web_docker/nginx/cert-key/
に移動しました。
docker-compose.ymlを修正する
docker-compose.ymlのnginxのイメージ箇所に下記のように設定します。
version: '3'
services:
nginx:
image: nginx:latest
container_name: codelike_web_nginx
ports:
- 8080:8080
- 443:443
depends_on:
- php
- db
volumes:
- ./nginx/codelike_server.conf:/etc/nginx/conf.d/default.conf
- ./nginx/cert-key/localhost+1.pem:/etc/certs/localhost+1.pem
- ./nginx/cert-key/localhost+1-key.pem:/etc/certs/localhost+1-key.pem
- ../:/var/www/html
追加したところの解説です。
まず、portsのところにhttps(ssl)通信するポート番号の443を記載しました。
volumesに先ほど、作成した証明書を/nginx/cert-key/
と/etc/certs/
配下で共有するように設定しました。
この証明書をnginxの設定ファイルで使います。
- ./nginx/cert-key/localhost+1.pem:/etc/certs/localhost+1.pem
- ./nginx/cert-key/localhost+1-key.pem:/etc/certs/localhost+1-key.pem
nginxの設定ファイルを修正する
/nginx/codelike_server.conf
に下記のように追加しました。
server {
listen 443 ssl;
ssl_certificate /etc/certs/localhost+1.pem;
ssl_certificate_key /etc/certs/localhost+1-key.pem;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
root /var/www/html/;
index index.php index.html;
charset utf-8;
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /$1.php;
}
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
}
SSL(443)で接続された場合の設定を追加しています。
普通にPHPを使えるようにするのと、違う箇所が下記になります。
listen 443 ssl;
ssl_certificate /etc/certs/localhost+1.pem;
ssl_certificate_key /etc/certs/localhost+1-key.pem;
SSLを使用するようにして、証明書を使うようにしています。
今回はPHPを動かすように設定していますが、Laravelの設定をここにすることでLaravelもHTTPS(SSL)で動いてくれます。
DockerなHTTPS通信の動作確認
https://localhostに接続してみると…
下記のようにHTTPS化できていることが確認できました。
終わりに
ローカル環境のSSL化が簡単にできました。
とあるライブラリでSSLが必要だったのでやってみましたが、簡単にできてよかった。。
8080ポートは、なんでSSLにならないんじゃ?とかちょっと思いましたが
SSLは443ポートを使うからですね。。
他のポート番号は使えるんだろうか…🤔
コメント