Jika anda pernah bergelut dengan menyediakan SSL dalam persekitaran Docker, anda tidak bersendirian. SSL boleh menjadi halangan yang menakutkan bagi ramai orang, tetapi adalah penting untuk melindungi aplikasi anda, terutamanya apabila ia terdedah kepada internet. Dalam siaran ini, saya akan membimbing anda melalui penambahan Nginx dan Certbot untuk penjanaan SSL Let's Encrypt dalam persediaan Dockerized. Ini membolehkan anda memperbaharui sijil secara automatik dan memastikan persekitaran anda selamat dengan kerumitan yang minimum.
Jom selami!
Dalam contoh ini, kami menggunakan Nginx sebagai proksi terbalik dan Certbot untuk mengurus sijil SSL. Di bawah, anda akan menemui docker-compose.yml, skrip shell untuk memuat semula Nginx secara automatik dan fail konfigurasi yang diperlukan untuk menyediakan segala-galanya.
Mula-mula, izinkan saya menunjukkan kepada anda konfigurasi Docker Compose untuk menyediakan Nginx dan Certbot.
# docker-compose.yml services: nginx: container_name: nginx image: nginx:latest restart: unless-stopped env_file: .env networks: - your-app-network # Update this with your application service network ports: - 80:80 - 443:443 depends_on: - your-app # Your application service volumes: - ./nginx/secure/:/etc/nginx/templates/ - /etc/localtime:/etc/localtime:ro - ./nginx/certbot/conf:/etc/letsencrypt - ./nginx/certbot/www:/var/www/certbot - ./nginx/99-autoreload.sh:/docker-entrypoint.d/99-autoreload.sh # Script to autoreload Nginx when certs are renewed certbot: image: certbot/certbot volumes: - ./nginx/certbot/conf:/etc/letsencrypt - ./nginx/certbot/www:/var/www/certbot entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'" # Renew certificates every 12 hours
Fail Docker Compose ini mentakrifkan dua perkhidmatan:
Perkhidmatan certbot berjalan dalam gelung tanpa had, memperbaharui sijil setiap 12 jam. Sijil disimpan dalam volum dikongsi (./nginx/certbot/conf), membolehkan Nginx mengakses fail sijil terkini.
Nginx berfungsi sebagai proksi terbalik, mengendalikan kedua-dua trafik HTTP dan HTTPS. Untuk permintaan awal, Certbot memerlukan HTTP (port 80) untuk melengkapkan proses pengesahan domain.
# default.conf.template server { listen 80; server_name ${APP_DOMAIN}; location / { return 301 https://$host$request_uri; } location /.well-known/acme-challenge/ { root /var/www/certbot; } } server { listen 443 ssl; server_name ${APP_DOMAIN}; server_tokens off; client_max_body_size 20M; ssl_certificate /etc/letsencrypt/live/${APP_DOMAIN}/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/${APP_DOMAIN}/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Url-Scheme $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://my-app:3000; // Your app service name } }
Dalam fail konfigurasi di atas, Nginx melakukan perkara berikut:
Selepas sijil SSL diperbaharui, Nginx harus dimuat semula untuk menggunakan sijil yang dikemas kini. Untuk mengautomasikan proses ini, tambahkan skrip muat semula automatik mudah:
# 99-autoreload.sh #!/bin/sh while :; do # Optional: Instead of sleep, detect config changes and only reload if necessary. sleep 6h nginx -t && nginx -s reload done &
Skrip ini dijalankan di dalam bekas Nginx dan memuatkan semula Nginx setiap 6 jam, atau apabila sijil diperbaharui.
Buat fail .env untuk menyimpan nama domain dan alamat e-mel anda untuk pendaftaran Certbot:
# .env file APP_DOMAIN=your-domain.com SSL_EMAIL=contact@your-domain.com
Sebelum Nginx boleh menyampaikan trafik HTTPS, anda perlu menjana sijil SSL awal. Gunakan skrip bash berikut (init-letsencrypt.sh) untuk menjana sijil SSL:
#!/bin/bash # Source the .env file if [ -f .env ]; then export $(grep -v '^#' .env | xargs) fi if ! [ -x "$(command -v docker compose)" ]; then echo 'Error: docker compose is not installed.' >&2 exit 1 fi domains=(${APP_DOMAIN:-example.com}) rsa_key_size=4096 data_path="./nginx/certbot" email="${SSL_EMAIL:-hello@example.com}" # Adding a valid address is strongly recommended staging=0 # Set to 1 if you're testing your setup to avoid hitting request limits if [ -d "$data_path" ]; then read -p "Existing data found for $domains. Continue and replace existing certificate? (y/N) " decision if [ "$decision" != "Y" ] && [ "$decision" != "y" ]; then exit fi fi if [ ! -e "$data_path/conf/options-ssl-nginx.conf" ] || [ ! -e "$data_path/conf/ssl-dhparams.pem" ]; then echo "### Downloading recommended TLS parameters ..." mkdir -p "$data_path/conf" curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf >"$data_path/conf/options-ssl-nginx.conf" curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem >"$data_path/conf/ssl-dhparams.pem" echo fi echo "### Creating dummy certificate for $domains ..." path="/etc/letsencrypt/live/$domains" mkdir -p "$data_path/conf/live/$domains" docker compose -f "docker-compose.yml" run --rm --entrypoint "\ openssl req -x509 -nodes -newkey rsa:$rsa_key_size -days 1\ -keyout '$path/privkey.pem' \ -out '$path/fullchain.pem' \ -subj '/CN=localhost'" certbot echo echo "### Starting nginx ..." docker compose -f "docker-compose.yml" up --force-recreate -d nginx echo echo "### Deleting dummy certificate for $domains ..." docker compose -f "docker-compose.yml" run --rm --entrypoint "\ rm -Rf /etc/letsencrypt/live/$domains && \ rm -Rf /etc/letsencrypt/archive/$domains && \ rm -Rf /etc/letsencrypt/renewal/$domains.conf" certbot echo echo "### Requesting Let's Encrypt certificate for $domains ..." #Join $domains to -d args domain_args="" for domain in "${domains[@]}"; do domain_args="$domain_args -d $domain" done # Select appropriate email arg case "$email" in "") email_arg="--register-unsafely-without-email" ;; *) email_arg="--email $email" ;; esac # Enable staging mode if needed if [ $staging != "0" ]; then staging_arg="--staging"; fi docker compose -f "docker-compose.yml" run --rm --entrypoint "\ certbot certonly --webroot -w /var/www/certbot \ $staging_arg \ $email_arg \ $domain_args \ --rsa-key-size $rsa_key_size \ --agree-tos \ --force-renewal" certbot echo #echo "### Reloading nginx ..." docker compose -f "docker-compose.yml" exec nginx nginx -s reload
Ringkasnya, konfigurasi yang disediakan di atas menyediakan Nginx sebagai proksi terbalik untuk aplikasi Dockerized anda, dengan sijil SSL Let's Encrypt diurus secara automatik oleh Certbot. Persediaan ini memastikan sambungan selamat ke aplikasi anda tanpa perlu melakukan pembaharuan SSL manual.
Untuk membangkitkan persekitaran anda pada kali pertama, gunakan:
chmod a+x init-letsencrypt.sh ./init-letsencrypt.sh
Masa berikut anda boleh memaparkan persekitaran anda dengan arahan karang docker biasa:
docker-compose up -d
Pastikan domain anda menghala ke pelayan anda dan port 80 dan 443 dibuka untuk membenarkan akses kepada trafik HTTP dan HTTPS.
Jika anda menghadapi sebarang isu atau mempunyai cadangan untuk penambahbaikan, beritahu saya dalam ulasan di bawah! Saya berbesar hati membantu menyelesaikan masalah atau mengembangkan topik tertentu.
Atas ialah kandungan terperinci Cabaran Mengenai SSL dalam Kontena Docker Tiada Siapa Bercakap. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!