質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Debian

Debianは、Debian GNU/Linux などのOS(オペレーティングシステム)です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

6153閲覧

DockerコンテナでSSL通信したいが「ERR_CONNECTION_CLOSED」エラー

chibi_kuma

総合スコア85

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

SSL

SSL(Secure Sockets Layer)とは、暗号化されたプロトコルで、インターネット上での通信セキュリティを提供しています。

Debian

Debianは、Debian GNU/Linux などのOS(オペレーティングシステム)です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2021/07/20 13:03

編集2021/07/22 06:21

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"

何が原因なのでしょうか?
どうかご教授、よろしくお願い申し上げます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hentaiman

2021/07/22 03:56

> ある一瞬だけ、SSL接続できていた時があるので、 仮に今がその時と全く同じ設定が出来ているとして > セキュリティソフトも一時OFF ファイヤーウォールもOFFにして試しましたか?
chibi_kuma

2021/07/22 04:20

hentaimanさん、いつもありがとうございます。 質問本文に追記をさせていただきました。 よろしくお願い申し上げます。
hentaiman

2021/07/22 04:26

chrome使ってるならポートが問題ならunsafe_portのエラーになると思うから多分関係無いとは思うけど、 念のためlocal側のlistenポートを10443から443に変更してみて動くか確認してみてはどうでしょう? それで動くならポートに対するブラウザ(またはノートン)の問題だし、それでも動かないならdocker側のapacheのエラーログ確認してエラーが起きてないか確認しましょう
chibi_kuma

2021/07/22 06:21

ご返答ありがとうございます。 追記2を追加させていただきました。 よろしくお願い申し上げます。
chibi_kuma

2021/07/22 07:34

つ、つながりましたー!! やったー! のちほと自己解決方法をまとめますので、しばしお待ちください。
guest

回答1

0

自己解決

修正箇所は、以下の通りです。

Dockerfile

1 2# 修正箇所1(/bin/sh -cが要らない) 3~~RUN /bin/sh -c a2ensite ssl~~ 4RUN a2ensite ssl 5 6# 修正箇所2(conf → site) 7~~RUN /bin/sh -c a2en**conf** sites-available_000-default~~ 8RUN /bin/sh -c a2en**site** sites-available_000-default 9 10# 修正箇所3(拡張子が不要) 11~~RUN /bin/sh -c a2ensite sites-available_default-ssl.conf~~ 12RUN /bin/sh -c a2ensite sites-available_default-ssl

「ERR_CONNECTION_CLOSED」になる一番の原因は、修正箇所1です。
よく理由は分かっていません。

mkcertが作成するSSL証明書の有効期限が825日になっているので、
それでChromeに弾かれているんじゃないか?だの、
「000-default.conf」「default-ssl.conf」は、
名前を変えてサーバーにコピーしてるからダメなんじゃないか?とか、
「ports.conf」も設定が居るんじゃないか?、とか
「ssl.conf」で「AddType application/x-pem-file .pem」が要るんじゃないかとか。

あれこれ検討違いなところばかり疑ってしまいました。
まさか、RUNコマンドに「/bin/sh -c」が付いていたからだったとは…

何故、RUNコマンドに「/bin/sh -c」を付けたかというと、
RUN a2enmod rewrite の行で、ビルド時にエラーが出たので、
RUNコマンドには「/bin/sh -c」が居るのかーと勝手に思い込んで、
全部のRUNに付けちゃったのが失敗でした。

また、sites-available、sites-enable の関係と、
「a2ensite」コマンドの意味を理解していなかったので、
余計に苦戦してしまいました。

hentaimanさん、コメントをいただき、ありがとうございました。
そして、お騒がせいたしました。
「/bin/sh -c」の意味や、サーバー構築の基礎部分をもっと勉強しないとダメですね。

投稿2021/07/22 08:55

chibi_kuma

総合スコア85

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問