Estoy dockerizando nuestra antigua aplicación actual. Usamos varios servicios, pero el que tengo problemas es php, apache y, específicamente, https para apache. Estoy usando la imagen "php:5.6.30-apache", así que tengo php y apache preinstalados.
Ahora cambié el "000-default.conf" con este contenido:
<VirtualHost *:80> ServerAdmin admin@admin.io DocumentRoot /var/www/html/app/htdocsAdmin ServerName admin.local.app.io CustomLog /var/log/apache2/app.admin.access.log "trueip_combined" ErrorLog /var/log/apache2/app.admin.error.log <Directory /var/www/html/app/htdocsAdmin> AllowOverride Options FileInfo AuthConfig Require all granted </Directory> </VirtualHost>Este es mi archivo docker:
FROM php:5.6.30-apache MAINTAINER Tzook Bar Noy ADD default /etc/apache2/sites-available/000-default.conf RUN apt-get update \ && apt-get install -y apt-utils \ && apt-get install -y php5-dev php5-memcached \ && apt-get install -y memcached RUN apt-get update && apt-get install -y apt-utils RUN apt-get install -y libz-dev libmemcached-dev RUN pecl install memcached-2.2.0 RUN echo extension=memcached.so >> /usr/local/etc/php/conf.d/memcached.ini RUN a2enmod rewrite RUN a2enmod ssl EXPOSE 80 EXPOSE 443No se preocupe por las cosas de Memcached, solo vea que habilito "ssl" y expongo los puertos 80,443
Esto se ejecuta con docker-compose:
php: build: context: ./php dockerfile: Dockerfile ports: - "80:80" - "443:443" volumes: - ./../../:/var/www/html networks: - appnet tty: truepero después de todo eso, sigo recibiendo esto de Chrome:
"ERR_SSL_PROTOCOL_ERROR" Como se solicitó en los comentarios, mi respuesta "docker ps": 
Además de habilitar ssl y exponer el puerto 443, debe crear un certificado (autofirmado) + clave privada y asegurarse de que Apache tenga acceso a ellos.
Recomiendo usar openSSL para crear un certificado autofirmado:
openssl req -new -newkey rsa:4096 -days 3650 -nodes -x509 -subj \ "/C=../ST=...../L=..../O=..../CN=..." \ -keyout ./ssl.key -out ./ssl.crtEn lugar de los puntos (...) complete su código de país de 2 letras (/C), el nombre de su estado o provincia (/ST), el nombre de su localidad (/L), el nombre de su organización ( /O) y su servidor FQDN (/CN)
Luego agregue las siguientes líneas a su archivo docker:
COPY ./path/to/ssl.crt /etc/apache2/ssl/ssl.crt COPY ./path/to/ssl.key /etc/apache2/ssl/ssl.key RUN mkdir -p /var/run/apache2/No estoy seguro de que la última línea sea realmente necesaria, pero en mi contenedor docker la carpeta aún no existía, lo que provocó que Apache fallara al iniciarse.
Finalmente, en su archivo 000-default.conf necesita agregar algo como esto:
<VirtualHost *:443> SSLEngine on SSLCertificateFile /etc/apache2/ssl/ssl.crt SSLCertificateKeyFile /etc/apache2/ssl/ssl.key .... </VirtualHost>Tenga en cuenta que cuando utiliza certificados autofirmados, la mayoría de los navegadores le avisarán que "Su conexión no es segura" (Firefox) o "Certificado no válido" (Chrome). Esto se debe a que no existe una cadena de seguridad válida para una CA de confianza. La mayoría de los navegadores le permiten continuar con su solicitud o agregar el sitio como una excepción para que ya no se muestre la advertencia.
Así es como habilité Apache SSL en Docker para el desarrollo local. Esto es con Docker ejecutando una imagen de Ubuntu en macOS (aunque mkcert también funciona con Linux y Windows):
• En macOS, instale mkcert :
brew install mkcert brew install nss # if you use Firefox mkcert facilita la creación e instalación de certificados SSL para uso de desarrollo local.
• Crear los certificados SSL:
mkcert mysite.localhost someothersite.localhost localhost 127.0.0.1 ::1Esto los instalará en macOS por ti, pero también dejará una copia de ellos en el directorio de trabajo actual:
mysite.localhost+4-key.pem mysite.localhost+4.pem • Haga que los dos archivos .pem estén disponibles para su contenedor Docker. por ejemplo: muévalos con los archivos de configuración de su contenedor y agregue algo como esto:
- ./config/ssl:/etc/apache2/ssl/ • Abra el puerto 443 en el docker-compose del contenedor:
- "443:443" (Y ciertamente debería EXPOSE 443 en la imagen también, aunque por alguna razón funcionó para mí sin hacerlo). (Editar: EXPOSE es puramente documentación y no realiza acciones según la documentación)
• Habilite SSL en Apache:
RUN ln -s /etc/apache2/mods-available/ssl.load /etc/apache2/mods-enabled/ssl.load Aunque, técnicamente, primero hice esto desde mi contenedor en ejecución, seguido de un apachectl restart . Hace que sea más fácil probar cosas y asegurarse de que todo funcionó antes de comprometerse a reconstruir la imagen.
• Configure su(s) sitio(s) web en Apache para que usen SSL editando mysite.localhost y cualquier otro dominio con el que desee usar SSL:
<VirtualHost *:443> … SSLEngine on SSLCertificateFile "/etc/apache2/ssl/clickandspeak.localhost+4.pem" SSLCertificateKeyFile "/etc/apache2/ssl/clickandspeak.localhost+4-key.pem" … </VirtualHost> … simplemente duplique su configuración anterior de <VirtualHost *:80> , cambie el puerto a 443 y agregue las tres líneas anteriores.
Reconstruya la imagen y reinicie el contenedor en el camino según sea necesario.
…y voila!