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-ийг хэрэгжүүлэх хэрэгтэй. Үнэнийг хэлэхэд би com zone-г судлахад 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 вэб програмтай холбох хамгийн хялбар арга юм.

Жич: Текстэнд үзүүлсэн бүх скриптүүд эцсийнх биш, төсөл одоо гүнзгий шатандаа байгаа тул тохиргоог шүүмжлэхгүй байхыг танаас хүсч байна - тэдгээрийг олон удаа өөрчлөх болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх