SSL-sertifikaat vir Docker-webtoepassing

In hierdie artikel wil ek 'n metode met u deel om 'n SSL-sertifikaat te skep vir u webtoepassing wat op Docker loop, want ... Ek het nie so 'n oplossing in die Russiestalige deel van die internet gevind nie.

SSL-sertifikaat vir Docker-webtoepassing

Meer besonderhede onder die snit.

Ons het docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 en 'n pint pure Let'sEncrypt gehad. Dit is nie dat dit nodig is om produksie op Docker te ontplooi nie. Maar sodra jy Docker begin bou, word dit moeilik om te stop.

So, om mee te begin, sal ek die standaard instellings gee - wat ons op die ontwikkelingstadium gehad het, d.w.s. sonder poort 443 en SSL in die 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 / {
        # 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 moet ons eintlik SSL implementeer. Om eerlik te wees, ek het ongeveer 2 uur spandeer om die com zone te bestudeer. Al die opsies wat daar aangebied word, is interessant. Maar in die huidige stadium van die projek moes ons (die besigheid) vinnig en betroubaar skroef SSL Let'sEnctypt к nginx houer en niks meer nie.

Eerstens het ons dit op die bediener geïnstalleer certbot
sudo apt-get install certbot

Vervolgens het ons jokertekensertifikate vir ons domein gegenereer

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


na uitvoering, sal certbot ons voorsien van 2 TXT-rekords wat in die DNS-instellings gespesifiseer moet word.

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


En druk enter.

Hierna sal certbot na die teenwoordigheid van hierdie rekords in DNS kyk en sertifikate vir jou skep.
as jy 'n sertifikaat bygevoeg het, maar certbot het dit nie gevind nie - probeer om die opdrag na 5-10 minute te herbegin.

Wel, hier is ons die trotse eienaars van 'n Let'sEncrypt-sertifikaat vir 90 dae, maar nou moet ons dit na Docker oplaai.

Om dit te doen, op die mees triviale manier, in docker-compose.yml, in die nginx-afdeling, skakel ons die gidse.

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"

Gekoppel? Groot - kom ons gaan voort:

Nou moet ons die konfigurasie verander nginx om mee te werk 443 hawe en SSL oor die algemeen:

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

Eintlik, na hierdie manipulasies, gaan ons na die gids met Docker-compose, skryf docker-compose up -d. En ons kyk na die funksionaliteit van SSL. Alles moet opstyg.

Die belangrikste ding is om nie te vergeet dat die Let'sEnctypt-sertifikaat vir 90 dae uitgereik word en dat u dit deur die opdrag moet hernu sudo certbot renew, en herbegin dan die projek met die opdrag docker-compose restart

Nog 'n opsie is om hierdie volgorde by crontab te voeg.

Na my mening is dit die maklikste manier om SSL aan Docker Web-app te koppel.

NS Neem asseblief in ag dat al die skrifte wat in die teks aangebied word nie finaal is nie, die projek is nou in die diep Ontwikkelingsstadium, so ek wil jou vra om nie die konfigurasies te kritiseer nie - hulle sal baie keer gewysig word.

Bron: will.com

Voeg 'n opmerking