Dockerで構築したコンテナで、SSL通信が出来る様にしたいと思っています。
環境は以下になります。
・Windows10 Home Edition
・Docker Desktop for Windows
Dockerコンテナのベースは、「php:7.4.20-apache」です。
OSは、Debianになります。
SSLを組み込む前に作成したコンテナでは、http://localhost:8080/で接続できる事は確認しています。
SSL証明書は、Windows側にmkcertをインストールして、以下の自己証明書(オレオレ証明書)を作成しました。
localhost.pem
localhost-key.pem
ここから、Dockerfile、docker-compose.yml にどう記述すれば良いのかが、
分からず、あちこちのサイトを参考にさせていただいて、書いては見たのですが、
うまくいきません。
Dockerfile
1From php:7.4.20-apache 2 3# tzdata、xdebugのインストール 4RUN apt-get update\ 5 && apt-get install -y\ 6 tzdata\ 7 libpq-dev\ 8 && pecl install xdebug\ 9 && rm -rf /var/lib/apt/lists/*\ 10 && docker-php-ext-install pdo_pgsql\ 11 && curl -sSLO https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64\ 12 && chmod +x mhsendmail_linux_amd64\ 13 && mv mhsendmail_linux_amd64 /usr/local/bin/mhsendmail\ 14 && echo 'sendmail_path = "/usr/local/bin/mhsendmail --smtp-addr=mailhog:1025"' > /usr/local/etc/php/conf.d/sendmail.ini\ 15 && mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled 16 17# rewriteが使える様にする。 18RUN /bin/sh -c a2enmod rewrite 19 20# SSIが使える様にする 21RUN /bin/sh -c a2enmod include 22 23# SSLを有効にする 24RUN /bin/sh -c a2enmod ssl 25 26# mod_sslを有効にする 27RUN /bin/sh -c a2ensite ssl 28 29# apache2.confをコンテナにコピー 30COPY /apache2.conf /etc/apache2/apache2.conf 31 32# SSL証明書、秘密鍵をコピー 33COPY /ssl/localhost.pem /etc/apache2/localhost.pem 34COPY /ssl/localhost-key.pem /etc/apache2/localhost-key.pem 35 36# 000-default.conf、default-ssl.confをコンテナにコピー 37COPY /sites-available_000-default.conf /etc/apache2/sites-available/sites-available_000-default.conf 38COPY /sites-available_default-ssl.conf /etc/apache2/sites-available/sites-available_default-ssl.conf 39 40RUN /bin/sh -c a2enconf sites-available_000-default 41RUN /bin/sh -c a2ensite sites-available_default-ssl.conf 42 43以下略
apache2.confは、出来上がったコンテナからapache2.confをホスト側にコピーして、以下を追加しました。
ドキュメントルートを変更しています。
apache2.conf
1(追加した箇所のみ) 2 3<Directory (ドキュメントルート)> 4 Options Includes 5 AllowOverride None 6 Require all granted 7 AddType text/html .html 8 AddOutputFilter INCLUDES .html 9</Directory>
000-default.confも、出来上がったコンテナの/etc/apache2/sites-available/から、000-default.confをホスト側にコピーして、
以下を変更しました。
sites-available_000-default.conf
000
1<VirtualHost *:80> 2 ServerName localhost 3 ServerAdmin webmaster@localhost 4 DocumentRoot (ドキュメントルート) 5</VirtualHost>
default-ssl.confも同様です。
sites-available_default-ssl.conf
default
1<IfModule mod_ssl.c> 2 <VirtualHost _default_:443> 3 ServerAdmin webmaster@localhost 4 ServerName localhost 5 DocumentRoot (ドキュメントルート) 6 ErrorLog ${APACHE_LOG_DIR}/error.log 7 CustomLog ${APACHE_LOG_DIR}/access.log combined 8 SSLEngine on 9 SSLCertificateFile /etc/apache2/localhost.pem 10 SSLCertificateKeyFile /etc/apache2/localhost-key.pem 11 <FilesMatch ".(cgi|shtml|phtml|php)$"> 12 SSLOptions +StdEnvVars 13 </FilesMatch> 14 <Directory /usr/lib/cgi-bin> 15 SSLOptions +StdEnvVars 16 </Directory> 17 </VirtualHost> 18</IfModule>
docker-compose.ymlは、こんな感じです。(Webサーバーの部分のみ)
docker
1version: '3.8' 2 3services: 4 web: 5 image: apache_php:1.0 6 build: ./apache_php 7 container_name: 'webServer' 8 ports: 9 - 8080:80 10 - 10443:443 11 privileged: true 12 stdin_open: true 13 tty: true 14 working_dir: '(ドキュメントルート)' 15 volumes: 16 - type: bind 17 source: ../(公開するフォルダ) 18 target: (ドキュメントルート)
Dockerfileをビルドして、コンテナを起動すると、無事、立ち上がるのですが、
ブラウザ(chrome 91.0)で、https://localhost:10443/index.html にアクセスすると、
「ERR_CONNECTION_CLOSED」というエラーになります。
index.htmlは、正しくbindされている事が確認できています。
パーミッションも問題ありませんでした。
Dockerにも、サーバー構築も、ほぼ初めてで、知識がなく、手探りのような状態で、
一日中、ごそごそいじっていたのですが、
ある一瞬だけ、SSL接続できていた時があるので、
(その環境を再現できなくなってしまった…!! 泣)
SSL証明書ファイルには問題ないかとは思うのですが…
Windowsにインストールされているセキュリティソフトも一時OFFにしてみましたが、
現象は変わりませんでした。
(追記1)
セキュリティソフトはノートンです。
ファイヤーウォールもノートンをOFFにすることで一緒にOFFになっているのではないかと思われます。
SSL接続できていた時の環境が再現できないままなのですが、
接続できていた時は、ノートンはOFFにはしていなかったので、
ノートンが邪魔をしているという事はないのかなと思います。
(追記2)
ポートを10443から443に変えても挙動に変化はありませんでした。
ログを確認してみました。
log
1> docker logs webServer 2 3AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.25.0.2. Set the 'ServerName' directive globally to suppress this message 4AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.25.0.2. Set the 'ServerName' directive globally to suppress this message 5[Thu Jul 22 15:10:07.855063 2021] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.4.20 configured -- resuming normal operations 6[Thu Jul 22 15:10:07.855146 2021] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND' 7[Thu Jul 22 15:10:19.510196 2021] [core:error] [pid 18] [client 172.25.0.1:45594] AH00082: an unknown filter was not added: includes
https://localhost:10443/で接続した時は、以下がログに表示されますが、少し遅れて出てきます。
172.25.0.1 - - [22/Jul/2021:15:11:11 +0900] "-" 408 0 "-" "-"
http://localhost:8080/で接続した時は、以下がログに表示されます。(ブラウザにはindex.htmlの内容が表示されます。)
172.25.0.1 - - [22/Jul/2021:15:10:19 +0900] "GET /index.html HTTP/1.1" 304 180 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36"
何が原因なのでしょうか?
どうかご教授、よろしくお願い申し上げます。
回答1件
あなたの回答
tips
プレビュー