コマンド一発でhttps通信できるローカル環境をDockerで作成した時のメモ。
Dockerfileの書き方で色々ハマりました。
まだよく分かってないけどとりあえず動いた。

Dockerfileは以下のような感じ

FROM php:7.1-apache

ADD ssl.conf /etc/apache2/sites-available/ssl.conf
ADD entrypoint.sh /opt/entrypoint.sh

RUN chmod a+x /opt/entrypoint.sh
RUN /bin/bash -c "source /opt/entrypoint.sh /etc/apache2/ssl_keys localhost"
RUN a2enmod ssl
RUN a2ensite ssl

CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

上記でentrypoint.shとssl.confというファイルを追加しています。
中身は

entrypoint.sh

このシェルファイルを実行することでssl証明書を自動で作成します。
証明書の保管場所は/etc/apache2/ssl_keysでドメインlocalhostに対して証明書を発行します。

# !/bin/sh

path=$1
servername=$2

mkdir -p ${path}
openssl genrsa -out ${path}/server.key 2048
openssl req -new -key ${path}/server.key -out ${path}/server.csr -subj '/C=JP/ST=Tokyo/L=Tokyo/O=Example Ltd./OU=Web/CN='${servername}
openssl x509 -in ${path}/server.csr -days 3650 -req -signkey ${path}/server.key -out ${path}/server.crt

ssl.conf

ssl.confはコンテナ内の/etc/apache2/sites-available/default-ssl.confのssl証明書へのパスなどを変えたものです。

<VirtualHost _default_:443>
    ServerAdmin webmaster@test.com

    DocumentRoot /var/www/web

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    SSLEngine on

    SSLCertificateFile /etc/apache2/ssl_keys/server.crt
    SSLCertificateKeyFile /etc/apache2/ssl_keys/server.key

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
        SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
        SSLOptions +StdEnvVars
    </Directory>

    <Directory /var/www/web>
        Options Indexes FollowSymLinks
        AllowOverride all
        Require all granted
    </Directory>
    DirectoryIndex index.php


    BrowserMatch "MSIE [2-6]" \
                  nokeepalive ssl-unclean-shutdown \
                  downgrade-1.0 force-response-1.0
    # MSIE 7 and newer should be able to use keepalive
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>

これでdocker-compose up -d実行するだけでhttps接続ができるようになりました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です