گواهی SSL برای برنامه وب Docker

در این مقاله می‌خواهم روشی را برای ایجاد گواهی SSL برای برنامه وب شما که روی Docker اجرا می‌شود با شما به اشتراک بگذارم، زیرا... من چنین راه حلی را در بخش روسی زبان اینترنت پیدا نکردم.

گواهی SSL برای برنامه وب Docker

جزئیات بیشتر در زیر برش.

ما docker v.17.05، docker-compose v.1.21، سرور اوبونتو 18 و یک لیوان Let'sEncrypt خالص داشتیم. این نیست که لازم باشد تولید را در 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 ساعت را صرف مطالعه com zone کردم. همه گزینه های ارائه شده در آنجا جالب هستند. اما در مرحله فعلی پروژه، ما (کسب و کار) نیاز داشتیم که به سرعت و به طور قابل اعتماد پیچ ​​کنیم SSL Let'sEnctypt к انجیناکس ظرف و هیچ چیز دیگر

اول از همه، ما آن را روی سرور نصب کردیم certbot
sudo apt-get install certbot

در مرحله بعد، گواهی نامه های wildcard برای دامنه خود تولید کردیم

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


پس از اجرا، certbot 2 رکورد TXT را در اختیار ما قرار می دهد که باید در تنظیمات 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"

مرتبط؟ عالی - بیایید ادامه دهیم:

حالا باید کانفیگ را تغییر دهیم انجیناکس برای کار با 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 است.

PS لطفاً در نظر داشته باشید که تمام اسکریپت های ارائه شده در متن نهایی نیستند، پروژه اکنون در مرحله Dev Dev است، بنابراین می خواهم از شما خواهش کنم که تنظیمات را مورد انتقاد قرار ندهید - آنها چندین بار اصلاح خواهند شد.

منبع: www.habr.com

اضافه کردن نظر