ローカルのDocker(PHP)環境でHTTPS(SSL)対応する

Docker

ローカルのDockerでHTTPS(SSL)対応しました。
dockerでPHPを動かしている環境です。Laravelでもローカル環境でHTTPS通信することが可能です。

とあるライブラリを使用するときにHTTPS(SSL)にする必要があり調べてみました。
すると、mkcertを使用することでローカルのHTTPS化が可能でした。

この記事では下記を解説しています。

・mkcertのインストール
・mkcertで証明書の作成
・HTTPSなDocker(PHP)環境の構築

試してみた環境は下記です。

OS:MacOS
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化できていることが確認できました。

dockerなphpでhttps(ssl)通信する

終わりに

ローカル環境のSSL化が簡単にできました。
とあるライブラリでSSLが必要だったのでやってみましたが、簡単にできてよかった。。

8080ポートは、なんでSSLにならないんじゃ?とかちょっと思いましたが
SSLは443ポートを使うからですね。。
他のポート番号は使えるんだろうか…🤔

コメント

タイトルとURLをコピーしました