SSL-certifikat til Docker web-app

I denne artikel vil jeg dele med dig en metode til at oprette et SSL-certifikat til din webapplikation, der kører på Docker, fordi... Jeg fandt ikke en sådan løsning på den russisksprogede del af internettet.

SSL-certifikat til Docker web-app

Flere detaljer under klippet.

Vi havde docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 og en pint ren Let'sEncrypt. Det er ikke, at det er nødvendigt at implementere produktion på Docker. Men når først du begynder at bygge Docker, bliver det svært at stoppe.

Så til at begynde med vil jeg give standardindstillingerne - som vi havde på dev-stadiet, dvs. uden port 443 og SSL generelt:

havnearbeider-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;
}

Dernæst skal vi faktisk implementere SSL. For at være ærlig brugte jeg omkring 2 timer på at studere com-zonen. Alle de muligheder, der tilbydes der, er interessante. Men på den nuværende fase af projektet havde vi (virksomheden) brug for hurtigt og pålideligt at skrue SSL Let'sEnctypt к Nginx container og intet mere.

Først og fremmest installerede vi det på serveren certbot
sudo apt-get install certbot

Dernæst genererede vi jokertegncertifikater for vores domæne

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


efter udførelse vil certbot give os 2 TXT-poster, der skal specificeres i DNS-indstillingerne.

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


Og tryk enter.

Herefter vil certbot kontrollere tilstedeværelsen af ​​disse poster i DNS og oprette certifikater til dig.
hvis du har tilføjet et certifikat men certbot fandt det ikke - prøv at genstarte kommandoen efter 5-10 minutter.

Nå, her er vi de stolte ejere af et Let'sEncrypt-certifikat i 90 dage, men nu skal vi uploade det til Docker.

For at gøre dette, på den mest trivielle måde, i docker-compose.yml, i nginx-sektionen, sammenkæder vi mapperne.

Eksempel docker-compose.yml med 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"

Forbundet? Fantastisk - lad os fortsætte:

Nu skal vi ændre konfigurationen Nginx at arbejde med 443 port og SSL generelt:

Eksempel main.conf config med 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;
	}
}

Faktisk, efter disse manipulationer, går vi til mappen med Docker-compose, skriver docker-compose up -d. Og vi tjekker funktionaliteten af ​​SSL. Alt skal tage fart.

Det vigtigste er ikke at glemme, at Let'sEnctypt-certifikatet udstedes i 90 dage, og du bliver nødt til at forny det gennem kommandoen sudo certbot renew, og genstart derefter projektet med kommandoen docker-compose restart

En anden mulighed er at tilføje denne sekvens til crontab.

Efter min mening er dette den nemmeste måde at forbinde SSL til Docker Web-app.

PS Vær venligst opmærksom på, at alle scripts præsenteret i teksten ikke er endelige, projektet er nu på det dybe udviklingsstadium, så jeg vil gerne bede dig om ikke at kritisere konfigurationerne - de vil blive ændret mange gange.

Kilde: www.habr.com

Tilføj en kommentar