web-dev-qa-db-fra.com

Impossible de faire fonctionner SSL dans le conteneur Docker

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?

21
Jay Blanchard

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.

33
Jay Blanchard