SSL-certificaat voor Docker-webapplicatie

In dit artikel wil ik een manier delen om een SSL-certificaat te creëren voor uw webapplicatie die draait op Docker, aangezien ik in het Nederlandstalige deel van het internet geen vergelijkbare oplossing heb gevonden.

SSL-certificaat voor Docker-webapplicatie

Lees verder onder de streep.

We hadden docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 en een frisse Let’sEncrypt-pint. Het was niet per se noodzakelijk om productie op Docker te draaien. Maar als je eenmaal begint met Docker, is het moeilijk om te stoppen.

Laten we beginnen met de standaardinstellingen die we hadden in de dev-fase, dus zonder poort 443 en SSL over het algemeen:

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 \/ {
        # probeer bestand rechtstreeks te serveren, val terug op 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 SSL implementeren. Om eerlijk te zijn, ik heb ongeveer 2 uur door de com-zone bestudeerd. Alle voorgestelde opties daar zijn interessant. Maar in deze fase van het project hadden we (de business) snel en betrouwbaar nodig. SSL Let’sEncrypt aan met alles wat daarin al aanwezig is, en de inhoud van de map voor de container en niet meer.

In de eerste plaats hebben we op de server geïnstalleerd certbot
sudo apt-get install certbot

Daarna hebben we wildcard-certificaten voor onze gegenereerd. domein

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


Na het uitvoeren zal certbot u 2 TXT-records geven die u in de DNS-instellingen moet invoeren.

_acme-challenge.stomup.ru TXT {de sleutel die CertBot u gaf}


En druk op enter.

Daarna controleert certbot of deze records in DNS aanwezig zijn en creëert het certificaten voor u.
als u het certificaat hebt toegevoegd, maar certbot het niet heeft gevonden — probeer de opdracht opnieuw binnen 5-10 minuten uit te voeren..

Nu zijn we trotse bezitters van een Let’sEncrypt-certificaat voor 90 dagen, maar nu moeten we het in Docker invoeren.

Daarvoor linken we heel eenvoudig de directories in docker-compose.yml, in de sectie nginx.

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"

Gelinkt? Geweldig — laten we verder gaan:

Nu moeten we de config wijzigen met alles wat daarin al aanwezig is, en de inhoud van de map om te werken met 443 de poort en SSL over het algemeen:

Voorbeeld van de config main.conf 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, na deze handelingen — gaan we naar de directory met Docker-compose, schrijven we docker-compose up -d en controleren we de werking van SSL. Alles zou opgestart moeten zijn.

Vergeet niet dat het Let’sEncrypt-certificaat voor 90 dagen wordt uitgegeven en dat je het moet vernieuwen met het commando sudo certbot renew, en start daarna het project opnieuw op met het commando docker-compose restart

Als optie — voeg deze reeks toe aan crontab.

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

P.S. Houd er rekening mee dat alle scripts die in de tekst worden gepresenteerd — niet definitief zijn; het project bevindt zich momenteel in een diepgaande ontwikkelingsfase, dus ik vraag jullie om de configs niet te bekritiseren - ze zullen nog vele keren worden aangepast.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster