Sertifikat SSL untuk aplikasi web Docker

Pada artikel ini, saya ingin berbagi dengan Anda metode membuat sertifikat SSL untuk aplikasi web Anda yang berjalan di Docker, karena... Saya tidak menemukan solusi seperti itu di bagian Internet berbahasa Rusia.

Sertifikat SSL untuk aplikasi web Docker

Lebih detail di bawah potongan.

Kami memiliki docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 dan satu pint Let'sEncrypt murni. Anda tidak perlu menerapkan produksi di Docker. Namun begitu Anda mulai membangun Docker, akan sulit untuk menghentikannya.

Jadi, untuk memulainya, saya akan memberikan pengaturan standar - yang kami miliki pada tahap pengembangan, yaitu. tanpa port 443 dan SSL pada umumnya:

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

Selanjutnya, kita perlu mengimplementasikan SSL. Sejujurnya, saya menghabiskan sekitar 2 jam mempelajari com zone. Semua opsi yang ditawarkan di sana menarik. Namun pada tahap proyek saat ini, kami (bisnis) perlu melakukan sekrup dengan cepat dan andal SSL Mari Enctypt ΠΊ nginx wadah dan tidak lebih.

Pertama-tama, kami menginstalnya di server certbot
sudo apt-get install certbot

Selanjutnya, kami membuat sertifikat wildcard untuk domain kami

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


setelah eksekusi, certbot akan memberi kita 2 data TXT yang perlu ditentukan dalam pengaturan DNS.

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


Dan tekan enter.

Setelah ini, certbot akan memeriksa keberadaan catatan ini di DNS dan membuatkan sertifikat untuk Anda.
jika Anda telah menambahkan sertifikat tetapi certbot tidak menemukannya - coba mulai ulang perintah setelah 5-10 menit.

Nah, di sinilah kami bangga menjadi pemilik sertifikat Let'sEncrypt selama 90 hari, tetapi sekarang kami perlu mengunggahnya ke Docker.

Untuk melakukan ini, dengan cara yang paling sepele, di docker-compose.yml, di bagian nginx, kami menautkan 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"

Tertaut? Bagus - mari kita lanjutkan:

Sekarang kita perlu mengubah konfigurasinya nginx bekerja dengan 443 pelabuhan dan SSL umumnya:

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, setelah manipulasi ini, kita masuk ke direktori dengan Docker-compose, tulis docker-compose up -d. Dan kami memeriksa fungsionalitas SSL. Semuanya harus lepas landas.

Hal utama adalah jangan lupa bahwa sertifikat Let'sEnctypt diterbitkan selama 90 hari dan Anda perlu memperbaruinya melalui perintah sudo certbot renew, lalu mulai ulang proyek dengan perintah docker-compose restart

Pilihan lainnya adalah menambahkan urutan ini ke crontab.

Menurut pendapat saya ini adalah cara termudah untuk menghubungkan SSL ke aplikasi Web Docker.

PS Harap diingat bahwa semua skrip yang disajikan dalam teks belum final, proyek ini sekarang berada pada tahap Dev mendalam, jadi saya ingin meminta Anda untuk tidak mengkritik konfigurasinya - konfigurasi tersebut akan dimodifikasi berkali-kali.

Sumber: www.habr.com

Tambah komentar