Certificat SSL pentru aplicația web Docker

În acest articol, vreau să vă împărtășesc o metodă de creare a unui certificat SSL pentru aplicația dvs. web care rulează pe Docker, deoarece... Nu am găsit o astfel de soluție în partea în limba rusă a internetului.

Certificat SSL pentru aplicația web Docker

Mai multe detalii sub tăietură.

Aveam docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 și o halbă de Let'sEncrypt pur. Nu este că este necesar să implementați producția pe Docker. Dar odată ce începi să construiești Docker, devine dificil să te oprești.

Deci, pentru început, voi da setările standard - pe care le aveam în stadiul de dezvoltare, adică. fără portul 443 și SSL în 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;
}

În continuare, trebuie să implementăm SSL. Sincer să fiu, am petrecut aproximativ 2 ore studiind zona com. Toate variantele oferite acolo sunt interesante. Dar, în stadiul actual al proiectului, noi (afacerea) trebuia să înșurubam rapid și fiabil SSL Let'sEnctypt к Nginx container și nimic mai mult.

În primul rând, l-am instalat pe server certbot
sudo apt-get install certbot

Apoi, am generat certificate wildcard pentru domeniul nostru

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


după execuție, certbot ne va furniza 2 înregistrări TXT care trebuie specificate în setările DNS.

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


Și apăsați enter.

După aceasta, certbot va verifica prezența acestor înregistrări în DNS și va crea certificate pentru dvs.
dacă ai adăugat un certificat dar certbot nu l-am găsit - încercați să reporniți comanda după 5-10 minute.

Ei bine, aici suntem mândrii proprietari ai unui certificat Let'sEncrypt timp de 90 de zile, dar acum trebuie să-l încărcăm în Docker.

Pentru a face acest lucru, în cel mai banal mod, în docker-compose.yml, în secțiunea nginx, legăm directoarele.

Exemplu docker-compose.yml cu 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"

Legat? Grozav - hai să continuăm:

Acum trebuie să schimbăm configurația Nginx a lucra cu 443 port si SSL în general:

Exemplu de configurare main.conf cu 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 fapt, după aceste manipulări, mergem în directorul cu Docker-compose, scriem docker-compose up -d. Și verificăm funcționalitatea SSL-ului. Totul ar trebui să decoleze.

Principalul lucru este să nu uitați că certificatul Let'sEnctypt este emis pentru 90 de zile și va trebui să îl reînnoiți prin comanda sudo certbot renew, apoi reporniți proiectul cu comanda docker-compose restart

O altă opțiune este să adăugați această secvență la crontab.

În opinia mea, acesta este cel mai simplu mod de a conecta SSL la aplicația web Docker.

PS Vă rugăm să țineți cont de faptul că toate scripturile prezentate în text nu sunt finale, proiectul se află acum în stadiul de Dev Deep, așa că aș dori să vă rog să nu criticați configurațiile - vor fi modificate de multe ori.

Sursa: www.habr.com

Adauga un comentariu