Cabaran Mengenai SSL dalam Kontena Docker Tiada Siapa Bercakap

Mary-Kate Olsen
Lepaskan: 2024-10-06 18:38:03
asal
732 orang telah melayarinya

The Challenge About SSL in Docker Containers No One Talks About

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!

Prasyarat

  • Docker dan Docker Compose dipasang pada mesin anda.
  • Pemahaman asas tentang Docker Compose dan Nginx.
  • Nama domain yang menunjuk ke pelayan anda.

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.

Konfigurasi Karang Docker

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


Salin selepas log masuk

Fail Docker Compose ini mentakrifkan dua perkhidmatan:

  • Nginx: Bertindak sebagai proksi terbalik dan menyampaikan permintaan ke bahagian belakang anda.
  • Certbot: Menjaga penjanaan dan memperbaharui sijil SSL menggunakan Let's Encrypt.

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.

Konfigurasi Nginx

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


Salin selepas log masuk

Dalam fail konfigurasi di atas, Nginx melakukan perkara berikut:

  1. Mengubah hala permintaan HTTP ke HTTPS untuk memastikan komunikasi selamat.
  2. Mengendalikan penamatan SSL dan permintaan proksi kepada perkhidmatan hujung belakang anda (cth., aplikasi saya:3000).

Auto-Muat Semula Konfigurasi Nginx

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 &


Salin selepas log masuk

Skrip ini dijalankan di dalam bekas Nginx dan memuatkan semula Nginx setiap 6 jam, atau apabila sijil diperbaharui.

Pembolehubah Persekitaran

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


Salin selepas log masuk

Penjanaan Sijil SSL permulaan

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



Salin selepas log masuk

Ringkasan

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.

Nota Akhir

Untuk membangkitkan persekitaran anda pada kali pertama, gunakan:


chmod a+x init-letsencrypt.sh
./init-letsencrypt.sh


Salin selepas log masuk

Masa berikut anda boleh memaparkan persekitaran anda dengan arahan karang docker biasa:


docker-compose up -d


Salin selepas log masuk

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!