Certificato SSL per l'app Web Docker

In questo articolo voglio condividere con te un metodo per creare un certificato SSL per la tua applicazione web in esecuzione su Docker, perché... Non ho trovato una soluzione del genere nella parte in lingua russa di Internet.

Certificato SSL per l'app Web Docker

Maggiori dettagli sotto il taglio.

Avevamo docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 e una pinta di puro Let'sEncrypt. Non è necessario distribuire la produzione su Docker. Ma una volta che inizi a costruire Docker, diventa difficile fermarti.

Quindi, per cominciare, fornirò le impostazioni standard, che avevamo in fase di sviluppo, ad es. senza porta 443 e SSL in generale:

finestra mobile-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;
}

Successivamente, dobbiamo effettivamente implementare SSL. Ad essere sincero, ho passato circa 2 ore a studiare la zona com. Tutte le opzioni offerte sono interessanti. Ma nella fase attuale del progetto, noi (l'azienda) dovevamo fregare in modo rapido e affidabile SSL Let'sEncrypt к nginx contenitore e niente più.

Prima di tutto lo abbiamo installato sul server certbot
sudo apt-get install certbot

Successivamente, abbiamo generato certificati con caratteri jolly per il nostro dominio

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


dopo l'esecuzione, certbot ci fornirà 2 record TXT che dovranno essere specificati nelle impostazioni DNS.

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


E premi Invio.

Successivamente, certbot controllerà la presenza di questi record nel DNS e creerà i certificati per te.
se hai aggiunto un certificato ma certbot non l'ho trovato: prova a riavviare il comando dopo 5-10 minuti.

Bene, eccoci qui gli orgogliosi proprietari di un certificato Let'sEncrypt per 90 giorni, ma ora dobbiamo caricarlo su Docker.

Per fare questo, nel modo più banale, in docker-compose.yml, nella sezione nginx, colleghiamo le directory.

Esempio 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"

Collegato? Ottimo, continuiamo:

Ora dobbiamo modificare la configurazione nginx lavorare con 443 porto e SSL generalmente:

Esempio di configurazione 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;
	}
}

In realtà, dopo queste manipolazioni, andiamo alla directory con Docker-compose, scriviamo docker-compose up -d. E controlliamo la funzionalità di SSL. Tutto dovrebbe decollare.

L'importante è non dimenticare che il certificato Let'sEnctypt viene rilasciato per 90 giorni e dovrai rinnovarlo tramite il comando sudo certbot renew, quindi riavviare il progetto con il comando docker-compose restart

Un'altra opzione è aggiungere questa sequenza a crontab.

Secondo me questo è il modo più semplice per connettere SSL all'app Web Docker.

PS Tieni presente che tutti gli script presentati nel testo non sono definitivi, il progetto è ora nella fase di sviluppo profondo, quindi vorrei chiederti di non criticare le configurazioni: verranno modificate molte volte.

Fonte: habr.com

Aggiungi un commento