Permettez-moi de commencer par dire que je ne suis pas administrateur de serveur et qu'il y a beaucoup de choses que je ne sais pas. Pour cette raison, je suis sûr d'avoir fait une erreur quelque part lors de la configuration de mon conteneur Docker, car SSL ne fonctionne pas.
Le conteneur exécute Apache 2.4 avec PHP 5.6 sur Ubuntu 14.04 et est lié à un conteneur Docker MySQL 5.6.
J'ai commencé avec cette configuration de base de Docker - Official PHP Repo . Voici les fichiers pertinents:
Dockefile
FROM php:5.6-Apache
RUN apt-get update
RUN apt-get install -y net-tools
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-install sockets
RUN a2enmod rewrite
RUN a2enmod ssl
ADD 000-default.conf /etc/Apache2/sites-enabled/
ADD default-ssl.conf /etc/Apache2/sites-anabled/
ADD Apache2.conf /etc/Apache2/
ADD www-server/ www-server/
EXPOSE 443
000-default.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /www-server/
ErrorLog ${Apache_LOG_DIR}/error.log
CustomLog ${Apache_LOG_DIR}/access.log combined
</VirtualHost>
<Directory /home/www-server/>
# allow .htaccess overrides to work
AllowOverride All
DirectoryIndex login.html index.html index.php
</Directory>
<Directory /home/www-server/client>
DirectoryIndex home.html
Options All
AllowOverride All
Require all granted
</Directory>
default-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /home/www-server
ErrorLog ${Apache_LOG_DIR}/error.log
CustomLog ${Apache_LOG_DIR}/access.log combined
# Enable/Disable SSL for this virtual Host.
SSLEngine on
SSLCertificateFile /etc/ssl/certs/site.crt
SSLCertificateKeyFile /etc/ssl/certs/site.key
SSLCACertificatePath /etc/ssl/certs/digicert/
</VirtualHost>
</IfModule>
Apache2.conf
Mutex file:/var/lock/Apache2 default
PidFile /var/run/Apache2/Apache2.pid
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User www-data
Group www-data
HostnameLookups Off
ErrorLog /proc/self/fd/2
LogLevel warn
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
# ports.conf
Listen 80
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /home/www-server/>
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
DocumentRoot /home/www-server
AccessFileName .htaccess
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
CustomLog /proc/self/fd/1 combined
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
# Multiple DirectoryIndex directives within the same context will add
# to the list of resources to look for rather than replace
# https://httpd.Apache.org/docs/current/mod/mod_dir.html#directoryindex
DirectoryIndex disabled
DirectoryIndex index.php index.html
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf
[~ # ~] note [~ # ~] : J'ai supprimé des parties non pertinentes de ces fichiers.
Pour exécuter le conteneur Docker, j'utilise ceci:
Sudo docker run -v /home/src/ssl-cert:/etc/ssl/certs --name app-gateway --link mysql56:mysql -p 80:80 -p 443:443 -d app-image
Voici une section des fichiers journaux:
::1 - - [10/Nov/2015:19:26:19 +0000] "OPTIONS * HTTP/1.0" 200 152 "-" "Apache/2.4.10 (Debian) PHP/5.6.15 OpenSSL/1.0.1k (internal dummy connection)"
::1 - - [10/Nov/2015:19:26:20 +0000] "OPTIONS * HTTP/1.0" 200 152 "-" "Apache/2.4.10 (Debian) PHP/5.6.15 OpenSSL/1.0.1k (internal dummy connection)"
72.5.190.136 - - [10/Nov/2015:19:26:21 +0000] "\x16\x03\x01" 400 0 "-" "-"
72.5.190.136 - - [10/Nov/2015:19:26:21 +0000] "\x16\x03\x01" 400 0 "-" "-"
72.5.190.136 - - [10/Nov/2015:19:26:21 +0000] "\x16\x03\x01" 400 0 "-" "-"
Avec cette erreur dans le navigateur:
ERR_SSL_PROTOCOL_ERROR
TL; DR J'ai suivi toutes les étapes que j'ai trouvées en ligne pour installer et utiliser mes certificats SSL dans un conteneur Docker mais je n'ai pas réussi en le faisant fonctionner. Y a-t-il quelque chose d'évident que j'ai négligé pour faire fonctionner SSL dans un conteneur Docker?
Parfois, surtout lorsque vous essayez de résoudre un problème depuis longtemps et que vous codez dans une fenêtre de console sur la ligne de commande, vous manquez les choses les plus simples. Jetez un œil à ces deux lignes dans le Dockerfile:
ADD 000-default.conf /etc/Apache2/sites-enabled/
ADD default-ssl.conf /etc/Apache2/sites-anabled/
Le a
est presque impossible à distinguer d'un e
, ce qui rend l'orthographe difficile à trouver. Le Dockerfile construit l'image correctement et ajoute le nouveau répertoire dans le conteneur, puis place le fichier de configuration dans ce répertoire.
drwxr-xr-x 2 www www 4096 Nov 11 15:56 sites-anabled
drwxr-xr-x 2 www www 4096 Oct 23 20:19 sites-available
drwxr-xr-x 2 www www 4096 Nov 11 15:56 sites-enabled
Puisqu'aucune erreur n'est levée pour un répertoire inconnu et que l'image se construit correctement, elle s'exécutera, mais dans ce cas, le SSL ne fonctionnera pas correctement.