SSL certifikat za spletno aplikacijo Docker

V tem članku želim z vami deliti metodo za ustvarjanje potrdila SSL za vašo spletno aplikacijo, ki se izvaja na Dockerju, ker... V rusko-jezičnem delu interneta nisem našel takšne rešitve.

SSL certifikat za spletno aplikacijo Docker

Več podrobnosti pod krojem.

Imeli smo docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 in pol litra čistega Let'sEncrypt. Ne gre za to, da je treba produkcijo razmestiti na Dockerju. Toda ko začnete graditi Docker, se ga je težko ustaviti.

Torej, za začetek bom dal standardne nastavitve - ki smo jih imeli na stopnji razvijalca, tj. brez vrat 443 in SSL na splošno:

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

Nato moramo dejansko implementirati SSL. Če sem iskren, sem porabil približno 2 uri za preučevanje com zone. Vse tam ponujene možnosti so zanimive. Toda v trenutni fazi projekta smo (podjetje) morali hitro in zanesljivo zaviti SSL Let'sEnctypt к nginx posoda in nič več.

Najprej smo namestili na strežnik certbot
sudo apt-get install certbot

Nato smo ustvarili nadomestna potrdila za našo domeno

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


po izvedbi nam bo certbot posredoval 2 zapisa TXT, ki ju moramo določiti v nastavitvah DNS.

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


In pritisnite enter.

Po tem bo certbot preveril prisotnost teh zapisov v DNS in za vas ustvaril potrdila.
če ste dodali potrdilo, vendar certbot ni našel - poskusite znova zagnati ukaz po 5-10 minutah.

No, tukaj smo ponosni lastniki certifikata Let'sEncrypt za 90 dni, zdaj pa ga moramo naložiti na Docker.

Da bi to naredili, na najbolj trivialen način, v docker-compose.yml, v razdelku nginx, povežemo imenike.

Primer docker-compose.yml s 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"

Povezano? Super - nadaljujmo:

Zdaj moramo spremeniti konfiguracijo nginx delati z 443 pristanišče in SSL na splošno:

Primer konfiguracije main.conf s 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;
	}
}

Pravzaprav po teh manipulacijah gremo v imenik z Docker-compose, napišemo docker-compose up -d. In preverimo delovanje SSL. Vse bi moralo vzleteti.

Glavna stvar je, da ne pozabite, da je potrdilo Let'sEnctypt izdano za 90 dni in ga boste morali obnoviti z ukazom sudo certbot renewin nato znova zaženite projekt z ukazom docker-compose restart

Druga možnost je, da to zaporedje dodate v crontab.

Po mojem mnenju je to najlažji način za povezavo SSL s spletno aplikacijo Docker.

PS Upoštevajte, da vsi skripti, predstavljeni v besedilu, niso dokončni, projekt je zdaj v fazi globokega razvijanja, zato bi vas prosil, da ne kritizirate konfiguracij - večkrat bodo spremenjene.

Vir: www.habr.com

Dodaj komentar