شهادة SSL لتطبيق Docker على الويب

في هذه المقالة، أريد أن أشاركك طريقة لإنشاء شهادة SSL لتطبيق الويب الخاص بك الذي يعمل على Docker، لأن... لم أجد مثل هذا الحل في الجزء الناطق باللغة الروسية من الإنترنت.

شهادة SSL لتطبيق Docker على الويب

مزيد من التفاصيل تحت الخفض.

كان لدينا docker v.17.05، وdocker-compose v.1.21، وUbuntu Server 18 ونصف لتر من Let'sEncrypt الخالص. لا يعني ذلك أنه من الضروري نشر الإنتاج على 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. لأكون صادقًا، قضيت حوالي ساعتين في دراسة منطقة com. جميع الخيارات المقدمة هناك مثيرة للاهتمام. ولكن في المرحلة الحالية من المشروع، نحن (الشركة) بحاجة إلى المسمار بسرعة وبشكل موثوق SSL Let'sEnctypt к NGINX حاوية ولا شيء أكثر من ذلك.

في البداية، قمنا بتثبيته على الخادم certbot
sudo apt-get install certbot

بعد ذلك، قمنا بإنشاء شهادات بدل لنطاقنا

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


بعد التنفيذ، سيزودنا certbot بسجلين TXT يجب تحديدهما في إعدادات DNS.

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


واضغط على دخول.

بعد ذلك، سيقوم 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.

ملحوظة: يرجى الأخذ في الاعتبار أن جميع النصوص المقدمة في النص ليست نهائية، والمشروع الآن في مرحلة التطوير العميق، لذا أود أن أطلب منك عدم انتقاد التكوينات - سيتم تعديلها عدة مرات.

المصدر: www.habr.com

إضافة تعليق