Certificat SSL per a l'aplicació web Docker

En aquest article, vull compartir amb vosaltres un mètode per crear un certificat SSL per a la vostra aplicació web que s'executa a Docker, perquè... No vaig trobar aquesta solució a la part d'Internet en llengua russa.

Certificat SSL per a l'aplicació web Docker

Més detalls sota el tall.

Teníem docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 i una pinta de Let'sEncrypt pur. No és que sigui necessari desplegar la producció a Docker. Però un cop comenceu a construir Docker, es fa difícil aturar-se.

Per tant, per començar, donaré la configuració estàndard, que teníem en l'etapa de desenvolupament, és a dir. sense port 443 i 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ó, realment necessitem implementar SSL. Per ser sincer, vaig passar unes 2 hores estudiant la zona de comunicació. Totes les opcions que s'hi ofereixen són interessants. Però en l'etapa actual del projecte, nosaltres (el negoci) havíem de cargolar de manera ràpida i fiable SSL Let'sEnctypt к nginx contenidor i res més.

En primer lloc, l'hem instal·lat al servidor certbot
sudo apt-get install certbot

A continuació, vam generar certificats de comodí per al nostre domini

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


després de l'execució, certbot ens proporcionarà 2 registres TXT que cal especificar a la configuració del DNS.

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


I premeu enter.

Després d'això, certbot comprovarà la presència d'aquests registres al DNS i crearà certificats per a vosaltres.
si has afegit un certificat però certbot no l'he trobat; proveu de reiniciar l'ordre després de 5-10 minuts.

Bé, aquí som els orgullosos propietaris d'un certificat Let'sEncrypt durant 90 dies, però ara hem de penjar-lo a Docker.

Per fer-ho, de la manera més trivial, a docker-compose.yml, a la secció nginx, enllacem els directoris.

Exemple docker-compose.yml amb 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"

Vinculat? Genial, continuem:

Ara hem de canviar la configuració nginx per treballar 443 port i SSL en general:

Exemple de configuració main.conf amb 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;
	}
}

De fet, després d'aquestes manipulacions, anem al directori amb Docker-compose, escriviu docker-compose up -d. I comprovem la funcionalitat de SSL. Tot hauria d'enlairar.

El més important és no oblidar que el certificat Let'sEnctypt s'emet durant 90 dies i haureu de renovar-lo mitjançant l'ordre sudo certbot renew, i després reinicieu el projecte amb l'ordre docker-compose restart

Una altra opció és afegir aquesta seqüència a crontab.

Al meu entendre, aquesta és la manera més fàcil de connectar SSL a l'aplicació web Docker.

PS Si us plau, tingueu en compte que tots els scripts presentats al text no són definitius, el projecte es troba ara en l'etapa de desenvolupament profund, així que m'agradaria demanar-vos que no critiqueu les configuracions: es modificaran moltes vegades.

Font: www.habr.com

Afegeix comentari