Chứng chỉ SSL cho ứng dụng web Docker

Trong bài viết này, tôi muốn chia sẻ với các bạn phương pháp tạo chứng chỉ SSL cho ứng dụng web chạy trên Docker, bởi vì... Tôi không tìm thấy giải pháp như vậy trong phần tiếng Nga của Internet.

Chứng chỉ SSL cho ứng dụng web Docker

Thêm chi tiết dưới phần cắt.

Chúng tôi đã có docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 và một nửa Let'sEncrypt thuần túy. Không nhất thiết phải triển khai sản xuất trên Docker. Nhưng một khi bạn bắt đầu xây dựng Docker, việc dừng lại sẽ trở nên khó khăn.

Vì vậy, để bắt đầu, tôi sẽ đưa ra các cài đặt tiêu chuẩn - mà chúng tôi đã có ở giai đoạn phát triển, tức là. không có cổng 443 và SSL nói chung:

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

Tiếp theo, chúng ta thực sự cần triển khai SSL. Thành thật mà nói, tôi đã dành khoảng 2 giờ để nghiên cứu vùng com. Tất cả các tùy chọn được cung cấp ở đó đều thú vị. Nhưng ở giai đoạn hiện tại của dự án, chúng tôi (doanh nghiệp) cần khắc phục sự cố một cách nhanh chóng và đáng tin cậy. SSL Let'sEnctypt к nginx thùng chứa và không có gì hơn.

Trước hết, chúng tôi đã cài đặt nó trên máy chủ certbot
sudo apt-get install certbot

Tiếp theo, chúng tôi đã tạo chứng chỉ ký tự đại diện cho miền của mình

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


sau khi thực thi, certbot sẽ cung cấp cho chúng ta 2 bản ghi TXT cần được chỉ định trong cài đặt DNS.

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


Và nhấn enter.

Sau đó, certbot sẽ kiểm tra sự hiện diện của các bản ghi này trong DNS và tạo chứng chỉ cho bạn.
nếu bạn đã thêm chứng chỉ nhưng certbot không tìm thấy - hãy thử khởi động lại lệnh sau 5-10 phút.

Chà, ở đây chúng tôi tự hào là chủ sở hữu của chứng chỉ Let'sEncrypt trong 90 ngày, nhưng bây giờ chúng tôi cần tải nó lên Docker.

Để làm điều này, theo cách đơn giản nhất, trong docker-compose.yml, trong phần nginx, chúng ta liên kết các thư mục.

Ví dụ docker-compose.yml với 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"

Liên kết? Tuyệt vời - hãy tiếp tục:

Bây giờ chúng ta cần thay đổi cấu hình nginx làm việc với 443 cảng và SSL nói chung là:

Ví dụ cấu hình main.conf với 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;
	}
}

Thực ra sau những thao tác này chúng ta vào thư mục có Docker-compose, viết docker-compose up -d. Và chúng tôi kiểm tra chức năng của SSL. Mọi thứ nên cất cánh.

Điều chính là đừng quên rằng chứng chỉ Let'sEnctypt được cấp trong 90 ngày và bạn sẽ cần gia hạn nó thông qua lệnh sudo certbot renew, sau đó khởi động lại dự án bằng lệnh docker-compose restart

Một tùy chọn khác là thêm chuỗi này vào crontab.

Theo tôi đây là cách dễ nhất để kết nối SSL với ứng dụng web Docker.

Tái bút Vui lòng lưu ý rằng tất cả các tập lệnh được trình bày trong văn bản đều không phải là tập lệnh cuối cùng, dự án hiện đang ở giai đoạn Dev sâu, vì vậy tôi xin bạn đừng chỉ trích các cấu hình - chúng sẽ được sửa đổi nhiều lần.

Nguồn: www.habr.com

Thêm một lời nhận xét