ใบรับรอง SSL สำหรับเว็บแอป Docker

ในบทความนี้ ฉันต้องการแบ่งปันวิธีการสร้างใบรับรอง SSL สำหรับเว็บแอปพลิเคชันของคุณที่ทำงานบน Docker เนื่องจาก... ฉันไม่พบวิธีแก้ปัญหาดังกล่าวในส่วนภาษารัสเซียของอินเทอร์เน็ต

ใบรับรอง SSL สำหรับเว็บแอป Docker

รายละเอียดเพิ่มเติมภายใต้การตัด

เราใช้ Docker เวอร์ชัน 17.05 และ Docker Compose เวอร์ชัน 1.21 Ubuntu Server 18 กับ Let's Encrypt สักแก้วใหญ่ๆ ไม่ใช่ว่าคุณจำเป็นต้องใช้งาน Docker ในระบบการผลิตเสมอไป แต่เมื่อคุณเริ่มสร้างด้วย Docker แล้ว มันยากที่จะหยุด

ก่อนอื่นเลย ผมจะให้การตั้งค่ามาตรฐาน ซึ่งเป็นการตั้งค่าที่เราใช้ในขั้นตอนการพัฒนา กล่าวคือ โดยไม่มีพอร์ต 443 และ SSL โดยทั่วไป:

นักเทียบท่า-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 มาเข้ารหัสกันเถอะ к Nginx คอนเทนเนอร์และไม่มีอะไรเพิ่มเติม

ก่อนอื่นเราติดตั้งมันบนเซิร์ฟเวอร์ certbot
sudo apt-get install certbot

ขั้นตอนต่อไป เราได้สร้างใบรับรองแบบไวด์การ์ดสำหรับ... โดเมน

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


หลังจากดำเนินการ certbot จะให้บันทึก TXT 2 รายการแก่เราซึ่งจำเป็นต้องระบุในการตั้งค่า DNS

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


และกด Enter

หลังจากนี้ Certbot จะตรวจสอบการมีอยู่ของบันทึกเหล่านี้ใน DNS และสร้างใบรับรองให้คุณ
หากคุณได้เพิ่มใบรับรองแล้ว certbot ไม่พบ - ลองรีสตาร์ทคำสั่งหลังจากผ่านไป 5-10 นาที.

ที่นี่เราเป็นเจ้าของใบรับรอง Let'sEncrypt อย่างภาคภูมิใจเป็นเวลา 90 วัน แต่ตอนนี้เราต้องอัปโหลดไปยัง Docker

ในการดำเนินการนี้ด้วยวิธีที่ไม่สำคัญที่สุดใน docker-compose.yml ในส่วน nginx เราจะเชื่อมโยงไดเร็กทอรี

ตัวอย่าง docker-compose.yml พร้อม 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"

เชื่อมโยง? เยี่ยมมาก - มาทำต่อ:

ตอนนี้เราต้องเปลี่ยนการกำหนดค่า Nginx ที่จะทำงานร่วมกับ 443 ท่าเรือและ SSL โดยทั่วไป:

ตัวอย่างการกำหนดค่า main.conf ด้วย 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;
	}
}

ที่จริงแล้วหลังจากการยักย้ายเหล่านี้เราไปที่ไดเร็กทอรีด้วย Docker-compose เขียน docker-compose up -d และเราตรวจสอบการทำงานของ SSL ทุกอย่างควรจะถอดออก

สิ่งสำคัญคืออย่าลืมว่าใบรับรอง Let'sEnctypt ออกให้เป็นเวลา 90 วันและคุณจะต้องต่ออายุผ่านคำสั่ง sudo certbot renewแล้วรีสตาร์ทโปรเจ็กต์ด้วยคำสั่ง docker-compose restart

อีกทางเลือกหนึ่งคือการเพิ่มลำดับนี้ลงใน crontab

ในความคิดของฉัน นี่เป็นวิธีที่ง่ายที่สุดในการเชื่อมต่อ SSL กับ Docker Web-app

ป.ล. โปรดคำนึงว่าสคริปต์ทั้งหมดที่นำเสนอในข้อความยังไม่สิ้นสุด ขณะนี้โปรเจ็กต์อยู่ในขั้นตอนการพัฒนาเชิงลึก ดังนั้นฉันอยากจะขอให้คุณอย่าวิพากษ์วิจารณ์การกำหนดค่า - พวกมันจะได้รับการแก้ไขหลายครั้ง

ที่มา: will.com

ซื้อโฮสติ้งที่เชื่อถือได้สำหรับไซต์ที่มีการป้องกัน DDoS เซิร์ฟเวอร์ VPS VDS 🔥 ซื้อบริการเว็บโฮสติ้งที่เชื่อถือได้ พร้อมระบบป้องกัน DDoS และเซิร์ฟเวอร์ VPS/VDS | ProHoster