Docker веб-бағдарламасы үшін SSL сертификаты

Бұл мақалада мен сізбен Docker жүйесінде жұмыс істейтін веб-қосымшаңыз үшін SSL сертификатын жасау әдісімен бөліскім келеді, себебі... Интернеттің орыс тілді бөлігінде мұндай шешімді таппадым.

Docker веб-бағдарламасы үшін SSL сертификаты

Кесу астында толығырақ.

Бізде docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 және бір пинт таза Let'sEncrypt болды. Docker-де өндірісті орналастыру қажет емес. Бірақ сіз Docker құрастыра бастағаннан кейін оны тоқтату қиынға соғады.

Сонымен, бастау үшін мен стандартты параметрлерді беремін - бізде әзірлеу кезеңінде болған, яғни. 443 порты және жалпы SSL жоқ:

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

Әрі қарай, біз шынымен SSL енгізуіміз керек. Шынымды айтсам, ком-зонаны зерттеуге 2 сағаттай уақыт жұмсадым. Онда ұсынылған нұсқалардың барлығы қызықты. Бірақ жобаның қазіргі кезеңінде бізге (бизнеске) тез және сенімді бұрау қажет болды SSL Let'sEnctypt к nginx контейнер және басқа ештеңе жоқ.

Ең алдымен, біз оны серверге орнаттық сертификат
sudo apt-get install certbot

Содан кейін біз домен үшін қойылмалы таңба сертификаттарын жасадық

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


орындағаннан кейін certbot бізге DNS параметрлерінде көрсетілуі қажет 2 TXT жазбасын береді.

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


Және enter пернесін басыңыз.

Осыдан кейін certbot осы жазбалардың DNS жүйесінде бар-жоғын тексереді және сізге сертификаттар жасайды.
егер сіз сертификат қосқан болсаңыз, бірақ сертификат оны таппадым - пәрменді 5-10 минуттан кейін қайта іске қосып көріңіз.

Міне, біз 90 күн бойы Let'sEncrypt сертификатының мақтан тұтатын иелеріміз, бірақ енді оны Docker-ге жүктеп салуымыз керек.

Мұны істеу үшін, ең тривиальды жолмен, docker-compose.yml ішінде, nginx бөлімінде біз каталогтарды байланыстырамыз.

SSL бар docker-compose.yml мысалы

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"

Байланысты ма? Керемет - әрі қарай жалғастырайық:

Енді біз конфигурацияны өзгертуіміз керек nginx жұмыс істеу 443 порт және SSL жалпы:

SSL көмегімен main.conf конфигурациясының мысалы

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

Шындығында, осы манипуляциялардан кейін біз Docker-compose көмегімен каталогқа барамыз, docker-compose up -d деп жазамыз. Біз SSL функционалдығын тексереміз. Барлығы көтерілуі керек.

Ең бастысы, Let'sEnctypt сертификаты 90 күнге берілетінін ұмытпау керек және оны пәрмен арқылы жаңарту қажет болады. sudo certbot renew, содан кейін жобаны пәрменмен қайта іске қосыңыз docker-compose restart

Басқа опция - бұл тізбекті crontab-қа қосу.

Менің ойымша, бұл SSL протоколын Docker Web-бағдарламасына қосудың ең оңай жолы.

PS Мәтінде ұсынылған барлық сценарийлер түпкілікті емес екенін ескеріңіз, жоба қазір терең өңдеу сатысында, сондықтан конфигурацияларды сынға алмауыңызды өтінемін - олар бірнеше рет өзгертіледі.

Ақпарат көзі: www.habr.com

пікір қалдыру