Sertifikat SSL untuk aplikasi web Docker

Dalam artikel ini saya ingin berbagi dengan Anda cara membuat sertifikat SSL untuk aplikasi web Docker Anda, sebagai di bagian Internet berbahasa Rusia - saya tidak menemukan solusi serupa.

gambar

Lebih detail di bawah potongan.

Kami memiliki docker v.17.05, docker-compose v.1.21, Ubuntu Server 18 dan satu pint bersih Let'sEncrypt. Bukan berarti perlu untuk menyebarkan produksi di Docker. Tetapi jika Anda mulai mengumpulkan Docker, menjadi sulit untuk berhenti.

Jadi sebagai permulaan, saya akan memberi Anda pengaturan default - yang kami miliki di tahap dev, yaitu. tanpa 443 port 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; } 


Selanjutnya, kita sebenarnya perlu menerapkan SSL. Jujur - Saya mempelajari com zone I dengan urutan 2 jam. Semua opsi yang diusulkan ada yang menarik. Tetapi pada tahap proyek saat ini, kami (bisnis) perlu dengan cepat dan andal mempercepat SSL Let'sEnctypt ke wadah nginx dan tidak lebih.

Pertama-tama, kami memasang certbot di server
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 kami 2 catatan TXT yang perlu ditentukan dalam pengaturan DNS.

 _acme-challenge.stomup.ru TXT {CertBot} 

Dan tekan enter.

Setelah itu, certbot akan memeriksa ketersediaan catatan ini dalam DNS dan membuat sertifikat untuk Anda.
jika Anda menambahkan sertifikat, tetapi certbot tidak menemukannya, coba mulai kembali perintah setelah 5-10 menit .

Nah, di sini kita adalah pemilik bangga sertifikat Let'sEncrypt selama 90 hari, tetapi sekarang kita perlu mengirimkannya ke Docker.

Untuk melakukan ini, dengan cara yang paling dangkal, 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" 


Sudahkah Anda terhubung? Super - lanjutkan:

Sekarang kita perlu mengubah konfigurasi nginx agar berfungsi dengan port 443 dan SSL secara umum:

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 pergi 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 dikeluarkan selama 90 hari dan Anda harus memperbaruinya melalui sudo certbot renew , dan kemudian memulai kembali proyek dengan docker-compose restart

Atau, tambahkan urutan ini ke crontab.

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

PS Tolong pertimbangkan bahwa semua skrip yang disajikan dalam teks belum final, sekarang proyek ini pada tahap Dev yang dalam, jadi saya ingin meminta Anda untuk tidak mengkritik file konfigurasi - mereka akan dimodifikasi berkali-kali.

Source: https://habr.com/ru/post/id481362/


All Articles