SSL-certificaat voor Docker-webapp

In dit artikel wil ik een methode met u delen voor het maken van een SSL-certificaat voor uw webapplicatie die op Docker draait, omdat... Ik heb zo'n oplossing niet gevonden in het Russischtalige deel van internet.

SSL-certificaat voor Docker-webapp

Meer details onder de snit.

We hadden docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 en een pint pure Let'sEncrypt. Het is niet zo dat het nodig is om productie op Docker te implementeren. Maar als je eenmaal begint met het bouwen van Docker, wordt het moeilijk om te stoppen.

Dus om te beginnen zal ik de standaardinstellingen geven - die we hadden in de ontwikkelingsfase, d.w.z. zonder poort 443 en SSL in het algemeen:

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

Vervolgens moeten we eigenlijk SSL implementeren. Om eerlijk te zijn, heb ik ongeveer 2 uur besteed aan het bestuderen van de com-zone. Alle aangeboden opties zijn interessant. Maar in de huidige fase van het project moesten wij (het bedrijf) snel en betrouwbaar schroeven SSL Let'sEnctypt к nginx houder en niets meer.

Allereerst hebben we het op de server geïnstalleerd certbot
sudo apt-get install certbot

Vervolgens hebben we wildcard-certificaten voor ons domein gegenereerd

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


na uitvoering zal certbot ons voorzien van 2 TXT-records die moeten worden opgegeven in de DNS-instellingen.

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


En druk op enter.

Hierna controleert Certbot de aanwezigheid van deze records in DNS en maakt certificaten voor u aan.
als u een certificaat hebt toegevoegd, maar certbot heb het niet gevonden - probeer de opdracht na 5-10 minuten opnieuw te starten.

Welnu, hier zijn we de trotse bezitters van een Let'sEncrypt-certificaat gedurende 90 dagen, maar nu moeten we het uploaden naar Docker.

Om dit op de meest triviale manier te doen, koppelen we in docker-compose.yml, in de nginx-sectie, de mappen.

Voorbeeld docker-compose.yml met 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"

Gekoppeld? Geweldig - laten we doorgaan:

Nu moeten we de configuratie wijzigen nginx werken met 443 haven en SSL over het algemeen:

Voorbeeld van main.conf-configuratie met 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;
	}
}

Eigenlijk gaan we na deze manipulaties naar de map met Docker-compose, schrijven docker-compose up -d. En we controleren de functionaliteit van SSL. Alles moet van de grond komen.

Het belangrijkste is om niet te vergeten dat het Let'sEnctypt-certificaat voor 90 dagen wordt uitgegeven en dat u het via de opdracht moet vernieuwen sudo certbot renewen start het project vervolgens opnieuw met de opdracht docker-compose restart

Een andere optie is om deze reeks aan crontab toe te voegen.

Naar mijn mening is dit de gemakkelijkste manier om SSL aan de Docker Web-app te koppelen.

PS Houd er rekening mee dat alle scripts die in de tekst worden gepresenteerd nog niet definitief zijn. Het project bevindt zich nu in de diepe ontwikkelingsfase, dus ik zou je willen vragen de configuraties niet te bekritiseren - ze zullen vele malen worden gewijzigd.

Bron: www.habr.com

Voeg een reactie