SSL certificate para sa Docker web-app

Sa artikulong ito, nais kong ibahagi sa iyo ang isang paraan para sa paglikha ng isang SSL certificate para sa iyong web application na tumatakbo sa Docker, dahil... Hindi ako nakahanap ng ganoong solusyon sa bahagi ng Internet sa wikang Ruso.

SSL certificate para sa Docker web-app

Higit pang mga detalye sa ilalim ng hiwa.

Mayroon kaming docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 at isang pint ng purong Let'sEncrypt. Ito ay hindi na kinakailangan upang i-deploy ang produksyon sa Docker. Ngunit kapag sinimulan mo na ang paggawa ng Docker, nagiging mahirap itong ihinto.

Kaya, upang magsimula sa, ibibigay ko ang mga karaniwang setting - na mayroon kami sa yugto ng dev, i.e. walang port 443 at SSL sa pangkalahatan:

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

Susunod, kailangan talaga nating ipatupad ang SSL. To be honest, mga 2 hours akong nag-aral sa com zone. Ang lahat ng mga opsyon na inaalok doon ay kawili-wili. Ngunit sa kasalukuyang yugto ng proyekto, kailangan namin (ang negosyo) na mabilis at mapagkakatiwalaan na i-screw SSL Let'sEnctypt ΠΊ nginx lalagyan at wala nang iba pa.

Una sa lahat, na-install namin ito sa server certbot
sudo apt-get install certbot

Susunod, nakabuo kami ng mga wildcard na certificate para sa aming domain

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


pagkatapos ng execution, bibigyan kami ng certbot ng 2 TXT record na kailangang tukuyin sa mga setting ng DNS.

_acme-challenge.stomup.ru TXT {Ρ‚ΠΎΡ‚ΠšΠ»ΡŽΡ‡ΠšΠΎΡ‚ΠΎΡ€Ρ‹ΠΉΠ’Π°ΠΌΠ’Ρ‹Π΄Π°Π»CertBot}


At pindutin ang enter.

Pagkatapos nito, titingnan ng certbot ang pagkakaroon ng mga talang ito sa DNS at gagawa ng mga certificate para sa iyo.
kung nagdagdag ka ng sertipiko ngunit certbot Hindi ko nahanap - subukang i-restart ang command pagkatapos ng 5-10 minuto.

Well, narito kami ang mapagmataas na may-ari ng isang Let'sEncrypt certificate sa loob ng 90 araw, ngunit ngayon ay kailangan naming i-upload ito sa Docker.

Upang gawin ito, sa pinakawalang halaga na paraan, sa docker-compose.yml, sa seksyon ng nginx, ini-link namin ang mga direktoryo.

Halimbawa docker-compose.yml na may 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"

Naka-link? Mahusay - magpatuloy tayo:

Ngayon kailangan nating baguhin ang config nginx magtrabaho kasama si 443 daungan at SSL pangkalahatan:

Halimbawa ng main.conf config na may 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;
	}
}

Sa totoo lang, pagkatapos ng mga manipulasyong ito, pumunta kami sa direktoryo na may Docker-compose, sumulat ng docker-compose up -d. At sinusuri namin ang functionality ng SSL. Ang lahat ay dapat mag-alis.

Ang pangunahing bagay ay huwag kalimutan na ang sertipiko ng Let'sEnctypt ay inisyu sa loob ng 90 araw at kakailanganin mong i-renew ito sa pamamagitan ng utos sudo certbot renew, at pagkatapos ay i-restart ang proyekto gamit ang command docker-compose restart

Ang isa pang opsyon ay idagdag ang sequence na ito sa crontab.

Sa palagay ko ito ang pinakamadaling paraan upang ikonekta ang SSL sa Docker Web-app.

PS Mangyaring isaalang-alang na ang lahat ng mga script na ipinakita sa teksto ay hindi pangwakas, ang proyekto ay nasa malalim na yugto ng Dev, kaya nais kong hilingin sa iyo na huwag punahin ang mga config - mababago sila nang maraming beses.

Pinagmulan: www.habr.com

Magdagdag ng komento