Dockerのphp-apacheコンテナをSSL(HTTPS)化する(ローカル環境・オレオレ証明書)

Docker

説明

ローカル環境で、SSL通信できるレシピを以下記載していきます。本件で使用する証明書はオレオレ証明書なので、本番環境で使用するのはやめておいた方がいいです
ちょっとお試しにスマホのブラウザで、加速度センサーを使いたいときなど、SSL通信環境でしかできない環境の場合、本件の内容が活かされると思います。

開発環境

■. 開発環境
・windows10 home
・VirtualBox
・Vagrant
・Docker version 19.03.14, build 5eb3275d40
・docker-compose version 1.27.4, build 40524192
■. 開発コンテナ
・Apache/2.4.38 (Debian)
・PHP 8.0.9 (cli)

必要なファイル・フォルダの準備

①. フォルダ・ファイル構成について

下の画像の構成のように、srcフォルダ(phpinfo.php), Dockerfile, docker-compose.yml, openssl.expを設置していきます。

②. Dockerfileの作成

FROM php:8.0-apache
RUN apt-get update \
    && apt-get install -y libpq-dev
RUN apt-get install -y less vim git expect

RUN cp /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini
RUN sed -i -e 's/memory\_limit \= 128M/memory\_limit \= 1024M/' \
    -i -e 's/\;date\.timezone \=/date\.timezone \= \"Asia\/Tokyo\"/' \
    -i -e "s/\;extension\_dir \= \'ext\'/extension\_dir \= \'ext\'/" \
    /usr/local/etc/php/php.ini
RUN sed -i -e 's/\;zend_extension\=opcache/zend_extension\=opcache/' \
    -i -e 's/\;opcache.enable\=1/opcache.enable\=1/' \
    -i -e 's/\;opcache.enable_cli\=0/opcache.enable_cli\=1/' \
    -i -e 's/\;opcache.optimization_level\=0x7FFFBFFF/opcache.optimization_level\=0x7FFFBFFF/' \
    -i -e 's/\;opcache.lockfile_path\=\/tmp/\;opcache.lockfile_path\=\/tmp\n\nopcache\.jit\_buffer\_size \= 128M/' \
    /usr/local/etc/php/php.ini

RUN mkdir ssl
COPY openssl.exp ssl/
WORKDIR /var/www/html/ssl
RUN openssl genrsa 2048 > server.key
RUN expect openssl.exp
RUN ls -la
RUN openssl x509 -days 36500 -req -signkey server.key < server.csr > server.crt
WORKDIR /var/www/html
RUN cp ssl/server.crt /etc/ssl/certs/
RUN cp ssl/server.key /etc/ssl/private/
RUN sed -i -e 's/\/etc\/ssl\/certs\/ssl\-cert\-snakeoil\.pem/\/etc\/ssl\/certs\/server\.crt/' \
    -i -e 's/\/etc\/ssl\/private\/ssl\-cert\-snakeoil\.key/\/etc\/ssl\/private\/server\.key/' \
    /etc/apache2/sites-available/default-ssl.conf
RUN a2enmod ssl \
    && a2ensite default-ssl.conf

RUN curl -s http://getcomposer.org/installer | php && \
    mv composer.phar /usr/local/bin/composer

③. docker-compose.ymlの作成

version: '3'
services:
  app:
    build: ./
    environment:
      - TZ=Asia/Tokyo
    ports:
      - '80:80'
      - '443:443'
    volumes:
      - ./src:/var/www/html

④. openssl.expの作成

こちらで、証明書を作っていきます。(expectファイルで対話型のコマンドに対応していきます。)

#!/usr/bin/expect

set ans1 81
set ans2 tokyo
set ans3 none
set ans4 "Local"
set ans5 "hogehoge123@gmail.com"
set ans6 password
set ans7 none

spawn openssl req -new -key server.key -out server.csr

expect {
        -regexp ".*Country Name.*" {
                send "${ans1}\n"
                exp_continue
        }
        -regexp ".*State or Province Name.*" {
                send "${ans2}\n"
                exp_continue
        }
         -regexp ".*Locality Name.*" {
                send "${ans2}\n"
                exp_continue
        }
         -regexp ".*Organization Name.*" {
                send "${ans3}\n"
                exp_continue
        }
        -regexp ".*Organizational Unit Name.*" {
                send "${ans3}\n"
                exp_continue
        }
        -regexp ".*Common Name.*" {
                send "${ans4}\n"
                exp_continue
        }
        -regexp ".*Email Address.*" {
                send "${ans5}\n"
                exp_continue
        }
        -regexp ".*A challenge password.*" {
                send "${ans6}\n"
                exp_continue
        }
        -regexp ".*An optional company name.*" {
                send "${ans7}\n"
                exp_continue
        }
}
exit 0

⑤. srcフォルダの作成、index.phpを作成し、srcフォルダに入れる

5-1. 空っぽのsrcフォルダを作成します。

5-2. phpinfo.phpの作成し、srcフォルダに入れる

<?php
    phpinfo();
?>

実行

今回作成した、ファイルのある階層まで移動し、以下のコマンドでを実行してください。

$ docker-compose up -d

確認

①. https://192.168.99.100/phpinfo.phpにアクセス。(※IPは人によって違うことがあるので、ご注意ください)
②. chromeの場合画面左下の「詳細情報を表示」をクリック
③. 192.168.99.100(安全ではありません)にアクセスするをクリック
④. phpinfoの情報が見れるサイトが表示されます。

安全ではありませんというのはあくまで、オレオレ証明書で作ったので、証明書にCAルート機関が登録されてないからです。なので、自分のローカル環境用としてやってみてください。

※証明書の確認は、画面左上の「保護されていない通信」をクリックし、「証明書(無効)」をクリックすれば確認できます。

以上です。

コメント

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