Certificado SSL para la aplicación web Docker

En este artículo, quiero compartir con ustedes un método para crear un certificado SSL para su aplicación web que se ejecuta en Docker, porque... No encontré esa solución en la parte de Internet en idioma ruso.

Certificado SSL para la aplicación web Docker

Más detalles debajo del corte.

Teníamos Docker v.17.05, Docker-compose v.1.21, Ubuntu Server 18 y una pinta de Let'sEncrypt puro. No es que sea necesario implementar la producción en Docker. Pero una vez que comienzas a construir Docker, resulta difícil detenerlo.

Entonces, para empezar, daré la configuración estándar, que teníamos en la etapa de desarrollo, es decir. sin puerto 443 y SSL en general:

docker-compose.yml

version: '2'
services:
    php:
        build: ./php-fpm
        volumes:
            - ./StomUp:/var/www/StomUp
            - ./php-fpm/php.ini:/usr/local/etc/php/php.ini
        depends_on:
            - mysql
        container_name: "StomPHP"
    web:
        image: nginx:latest
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - ./StomUp:/var/www/StomUp
            - ./nginx/main.conf:/etc/nginx/conf.d/default.conf
        depends_on:
            - php
    mysql:
        image: mysql:5.7
        command: mysqld --sql_mode=""
        environment:
            MYSQL_ROOT_PASSWORD: xxx
        ports:
            - "3333:3306"

nginx/main.conf

 server {
    listen 80;
    server_name *.stomup.ru stomup.ru;
   root /var/www/StomUp/public;
     client_max_body_size 5M;

    location / {
        # try to serve file directly, fallback to index.php
        try_files $uri /index.php$is_args$args;
  }

    location ~ ^/index.php(/|$) {
      #fastcgi_pass unix:/var/run/php7.2-fpm.sock;
       fastcgi_pass php:9000;
       fastcgi_split_path_info ^(.+.php)(/.*)$;
      include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
       fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_buffer_size 128k;
       fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
       internal;
    }

    location ~ .php$ {
        return 404;
    }

     error_log /var/log/nginx/project_error.log;
    access_log /var/log/nginx/project_access.log;
}

A continuación, necesitamos implementar SSL. Para ser honesto, pasé aproximadamente 2 horas estudiando la zona de comunicaciones. Todas las opciones que allí se ofrecen son interesantes. Pero en la etapa actual del proyecto, nosotros (la empresa) necesitábamos atornillar de manera rápida y confiable SSL Let'sEnctypt к nginx contenedor y nada más.

Primero que nada, lo instalamos en el servidor. certbot
sudo apt-get install certbot

A continuación, generamos certificados comodín para nuestro dominio.

sudo certbot certonly -d stomup.ru -d *.stomup.ru --manual --preferred-challenges dns


Después de la ejecución, certbot nos proporcionará 2 registros TXT que deben especificarse en la configuración de DNS.

_acme-challenge.stomup.ru TXT {тотКлючКоторыйВамВыдалCertBot}


Y presione enter.

Después de esto, certbot verificará la presencia de estos registros en DNS y creará certificados para usted.
si ha agregado un certificado pero certbot No lo encontré. Intente reiniciar el comando después de 5 a 10 minutos..

Bueno, aquí somos los orgullosos propietarios de un certificado Let'sEncrypt durante 90 días, pero ahora necesitamos cargarlo en Docker.

Para ello, de la forma más trivial, en docker-compose.yml, en la sección nginx, vinculamos los directorios.

Ejemplo docker-compose.yml con SSL

version: '2'
services:
    php:
        build: ./php-fpm
        volumes:
            - ./StomUp:/var/www/StomUp
            - /etc/letsencrypt/live/stomup.ru/:/etc/letsencrypt/live/stomup.ru/
            - ./php-fpm/php.ini:/usr/local/etc/php/php.ini
        depends_on:
            - mysql
        container_name: "StomPHP"
    web:
        image: nginx:latest
        ports:
            - "80:80"
            - "443:443"
        volumes:
            - ./StomUp:/var/www/StomUp
            - /etc/letsencrypt/:/etc/letsencrypt/
            - ./nginx/main.conf:/etc/nginx/conf.d/default.conf
        depends_on:
            - php
    mysql:
        image: mysql:5.7
        command: mysqld --sql_mode=""
        environment:
            MYSQL_ROOT_PASSWORD: xxx
        ports:
            - "3333:3306"

¿Vinculado? Genial, continuemos:

Ahora necesitamos cambiar la configuración. nginx trabajar con 443 puerto y SSL generalmente:

Ejemplo de configuración de main.conf con SSL

#
server {
	listen 443 ssl http2;
	listen [::]:443 ssl http2;

	server_name *.stomup.ru stomup.ru;
	set $base /var/www/StomUp;
	root $base/public;

	# SSL
	ssl_certificate /etc/letsencrypt/live/stomup.ru/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/stomup.ru/privkey.pem;
	ssl_trusted_certificate /etc/letsencrypt/live/stomup.ru/chain.pem;

      client_max_body_size 5M;

      location / {
          # try to serve file directly, fallback to index.php
          try_files $uri /index.php$is_args$args;
      }

      location ~ ^/index.php(/|$) {
          #fastcgi_pass unix:/var/run/php7.2-fpm.sock;
          fastcgi_pass php:9000;
          fastcgi_split_path_info ^(.+.php)(/.*)$;
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
          fastcgi_param DOCUMENT_ROOT $realpath_root;
          fastcgi_buffer_size 128k;
          fastcgi_buffers 4 256k;
          fastcgi_busy_buffers_size 256k;
          internal;
      }

      location ~ .php$ {
          return 404;
      }

      error_log /var/log/nginx/project_error.log;
      access_log /var/log/nginx/project_access.log;
}


# HTTP redirect
server {
	listen 80;
	listen [::]:80;

	server_name *.stomup.ru stomup.ru;

	location / {
		return 301 https://stomup.ru$request_uri;
	}
}

En realidad, después de estas manipulaciones, vamos al directorio con Docker-compose, escribimos docker-compose up -d. Y comprobamos la funcionalidad de SSL. Todo debería despegar.

Lo principal es no olvidar que el certificado Let'sEnctypt se emite por 90 días y deberás renovarlo mediante el comando sudo certbot renewy luego reinicie el proyecto con el comando docker-compose restart

Otra opción es agregar esta secuencia a crontab.

En mi opinión, esta es la forma más sencilla de conectar SSL a la aplicación web Docker.

PD: Tenga en cuenta que todos los scripts presentados en el texto no son definitivos, el proyecto se encuentra ahora en la etapa de desarrollo profundo, por lo que me gustaría pedirles que no critiquen las configuraciones: se modificarán muchas veces.

Fuente: habr.com

Añadir un comentario