Sijil SSL untuk aplikasi web Docker

Dalam artikel ini, saya ingin berkongsi dengan anda kaedah untuk mencipta sijil SSL untuk aplikasi web anda yang berjalan di Docker, kerana... Saya tidak menemui penyelesaian sedemikian dalam bahagian Internet berbahasa Rusia.

Sijil SSL untuk aplikasi web Docker

Butiran lanjut di bawah potongan.

Kami mempunyai docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 dan satu pain Let'sEncrypt tulen. Bukannya perlu untuk menggunakan pengeluaran pada Docker. Tetapi apabila anda mula membina Docker, ia menjadi sukar untuk dihentikan.

Jadi, sebagai permulaan, saya akan memberikan tetapan standard - yang kami ada pada peringkat dev, i.e. tanpa port 443 dan SSL secara umum:

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

Seterusnya, kita sebenarnya perlu melaksanakan SSL. Sejujurnya, saya menghabiskan kira-kira 2 jam belajar zon com. Semua pilihan yang ditawarkan di sana adalah menarik. Tetapi pada peringkat semasa projek, kami (perniagaan) perlu cepat dan boleh dipercayai SSL Let'sEnctypt ΠΊ nginx bekas dan tidak lebih.

Pertama sekali, kami memasangnya pada pelayan certbot
sudo apt-get install certbot

Seterusnya, kami menjana sijil kad bebas untuk domain kami

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


selepas pelaksanaan, certbot akan memberikan kami 2 rekod TXT yang perlu dinyatakan dalam tetapan DNS.

_acme-challenge.stomup.ru TXT {Ρ‚ΠΎΡ‚ΠšΠ»ΡŽΡ‡ΠšΠΎΡ‚ΠΎΡ€Ρ‹ΠΉΠ’Π°ΠΌΠ’Ρ‹Π΄Π°Π»CertBot}


Dan tekan enter.

Selepas ini, certbot akan menyemak kehadiran rekod ini dalam DNS dan mencipta sijil untuk anda.
jika anda telah menambah sijil tetapi certbot tidak menemuinya - cuba mulakan semula arahan selepas 5-10 minit.

Nah, di sini kami adalah pemilik bangga sijil Let'sEncrypt selama 90 hari, tetapi kini kami perlu memuat naiknya ke Docker.

Untuk melakukan ini, dengan cara yang paling remeh, dalam docker-compose.yml, dalam bahagian nginx, kami memautkan direktori.

Contoh docker-compose.yml dengan 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"

Dipautkan? Hebat - mari teruskan:

Sekarang kita perlu menukar konfigurasi nginx untuk bekerja dengan 443 pelabuhan dan SSL secara amnya:

Contoh konfigurasi main.conf dengan 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;
	}
}

Sebenarnya, selepas manipulasi ini, kita pergi ke direktori dengan Docker-compose, tulis docker-compose up -d. Dan kami menyemak kefungsian SSL. Semuanya harus berlepas.

Perkara utama adalah jangan lupa bahawa sijil Let'sEnctypt dikeluarkan selama 90 hari dan anda perlu memperbaharuinya melalui arahan sudo certbot renew, dan kemudian mulakan semula projek dengan arahan docker-compose restart

Pilihan lain ialah menambah urutan ini pada crontab.

Pada pendapat saya ini adalah cara paling mudah untuk menyambungkan SSL ke aplikasi Web Docker.

PS Sila ambil kira bahawa semua skrip yang dibentangkan dalam teks bukanlah muktamad, projek itu kini berada di peringkat Dev yang mendalam, jadi saya ingin meminta anda untuk tidak mengkritik konfigurasi - ia akan diubah suai berkali-kali.

Sumber: www.habr.com

Tambah komen