Certifikata SSL për aplikacionin në internet Docker

Në këtë artikull, unë dua të ndaj me ju një metodë për krijimin e një certifikate SSL për aplikacionin tuaj në internet që funksionon në Docker, sepse... Unë nuk gjeta një zgjidhje të tillë në pjesën në gjuhën ruse të internetit.

Certifikata SSL për aplikacionin në internet Docker

Më shumë detaje nën prerje.

Ne kishim docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 dhe një pintë letre të pastër Let'sEncrypt. Nuk është se është e nevojshme të vendoset prodhimi në Docker. Por sapo të filloni të ndërtoni Docker, bëhet e vështirë të ndalosh.

Pra, për të filluar, unë do të jap cilësimet standarde - të cilat i kishim në fazën e devijimit, d.m.th. pa port 443 dhe SSL në përgjithësi:

prerës-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/kryesore.konf

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

Tjetra, ne në fakt duhet të implementojmë SSL. Për të qenë i sinqertë, kalova rreth 2 orë duke studiuar zonën com. Të gjitha opsionet e ofruara atje janë interesante. Por në fazën aktuale të projektit, ne (biznesi) duhej të vidhosnim shpejt dhe me besueshmëri SSL Let'sEnctypt к nginx kontejner dhe asgjë më shumë.

Para së gjithash, ne e instaluam atë në server çertbot
sudo apt-get install certbot

Më pas, ne krijuam certifikata të karakterit të egër për domenin tonë

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


pas ekzekutimit, certbot do të na sigurojë 2 regjistrime TXT që duhet të specifikohen në cilësimet DNS.

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


Dhe shtypni enter.

Pas kësaj, certbot do të kontrollojë praninë e këtyre të dhënave në DNS dhe do të krijojë certifikata për ju.
nëse keni shtuar një certifikatë por çertbot nuk e gjeta - provoni të rinisni komandën pas 5-10 minutash.

Epo, këtu jemi pronarë krenarë të një certifikate Let'sEncrypt për 90 ditë, por tani duhet ta ngarkojmë atë në Docker.

Për ta bërë këtë, në mënyrën më të parëndësishme, në docker-compose.yml, në seksionin nginx, ne lidhim drejtoritë.

Shembull docker-compose.yml me 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"

E lidhur? E shkëlqyeshme - le të vazhdojmë:

Tani duhet të ndryshojmë konfigurimin nginx për të punuar me 443 port dhe SSL në përgjithësi:

Shembull i konfigurimit main.conf me 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;
	}
}

Në fakt, pas këtyre manipulimeve, shkojmë në drejtori me Docker-compose, shkruajmë docker-compose up -d. Dhe ne kontrollojmë funksionalitetin e SSL. Gjithçka duhet të hiqet.

Gjëja kryesore është të mos harroni se certifikata Let'sEnctypt lëshohet për 90 ditë dhe do t'ju duhet ta rinovoni atë përmes komandës sudo certbot renew, dhe më pas rinisni projektin me komandën docker-compose restart

Një tjetër mundësi është të shtoni këtë sekuencë në crontab.

Sipas mendimit tim, kjo është mënyra më e lehtë për të lidhur SSL me aplikacionin Docker Web.

PS Ju lutemi kini parasysh që të gjitha skriptet e paraqitura në tekst nuk janë përfundimtare, projekti tani është në fazën e Dev të thellë, ndaj do të doja t'ju kërkoja të mos kritikoni konfigurimet - ato do të modifikohen shumë herë.

Burimi: www.habr.com

Shto një koment