پرش به محتویات

شب ۰۹: TLS و ACME در Compose

بخش ۰۹ از مجموعهٔ آموزش Traefik در ۳۰ شب؛ هر جلسه برای ۶۰ تا ۹۰ دقیقه مطالعه، تمرین عملی، بررسی نتیجه و تمرین رفع خرابی طراحی شده است. مثال‌ها مطابق منبع با Traefik Proxy v3.7 نوشته شده‌اند؛ برای محیط عملیاتی نسخهٔ اصلاحی آزموده‌شده یا digest مشخصی را ثابت کنید. تمرین‌ها را روی میزبان یا کلاستر آزمایشگاهی اجرا کنید.

فهرست کامل دورهٔ ترافیک در ۳۰ شب

هدف‌های یادگیری

  • خاتمه‌دادن TLS با گواهی محلی و گزینه‌های امن TLS.
  • تنظیم چالش‌های ACME بدون commit کردن اعتبارنامه‌ها.
  • پشتیبان‌گیری و بررسی ایمن وضعیت گواهی‌ها.

تمرین عملی: ابتدا TLS محلی

گواهی‌های شب ۰۶ را mount و تنظیمات پویا را اضافه کنید:

# dynamic/tls.yml
tls:
  certificates:
    - certFile: /certs/whoami.crt
      keyFile: /certs/whoami.key
  options:
    default:
      minVersion: VersionTLS12
      sniStrict: true
# startup additions in traefik.yml
entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint: {to: websecure, scheme: https, permanent: true}
  websecure:
    address: ":443"
certificatesResolvers:
  letsencrypt:
    acme:
      email: admin@example.test
      storage: /state/acme.json
      # Use staging while testing a public domain:
      caServer: https://acme-staging-v02.api.letsencrypt.org/directory
      httpChallenge: {entryPoint: web}
# Compose mount/label additions
services:
  traefik:
    volumes:
      - ./certs:/certs:ro
      - ./state:/state
  whoami:
    labels:
      traefik.http.routers.whoami.entrypoints: websecure
      traefik.http.routers.whoami.tls: "true"
      # For a real public hostname only:
      # traefik.http.routers.whoami.tls.certresolver: letsencrypt
mkdir -p state
touch state/acme.json && chmod 600 state/acme.json
docker compose up -d
curl -I --resolve whoami.example.test:80:127.0.0.1 http://whoami.example.test/
curl --cacert certs/lab-ca.crt --resolve whoami.example.test:443:127.0.0.1 \
  https://whoami.example.test/
openssl s_client -connect 127.0.0.1:443 -servername whoami.example.test \
  -CAfile certs/lab-ca.crt -verify_return_error </dev/null
cp -p state/acme.json state/acme.json.$(date +%Y%m%d).bak

انتخاب چالش:

  • HTTP-01: نام در DNS عمومی و پورت ورودی ۸۰ باید به این نمونهٔ Traefik برسند.
  • TLS-ALPN-01: نام در DNS عمومی و پورت ورودی ۴۴۳ باید بدون خاتمه یا رهگیری TLS در میانه به آن برسند.
  • DNS-01: برای wildcard لازم است و پشت ورودی محدود مفید است؛ اعتبارنامهٔ ارائه‌دهنده را در secretهای زمان اجرا نگه دارید و دسترسی‌اش را به تغییرات DNS محدود کنید.

روش‌های پیشنهادی

  • تا اثبات روند چالش از محیط staging در ACME استفاده کنید تا به محدودیت نرخ CA نرسید.
  • ایمیل، دامنه و اعتبارنامهٔ نمونه را بدون تغییر به محیط عملیاتی نبرید.
  • پشتیبان ACME خارج از میزبان را رمزگذاری و پس از بازیابی مجوز 0600 را بررسی کنید.
  • انقضای گواهی را مستقل از لاگ Traefik پایش کنید.
  • زنجیرهٔ کامل را ارائه و SNI را برای هر دستهٔ نام میزبان تأیید کنید.
  • acme.json را هم‌زمان میان نمونه‌ها مشترک نکنید.

نکته‌های عیب‌یابی

  • گواهی پیش‌فرض Traefik ارائه می‌شود: گواهی منطبق بارگذاری یا صادر نشده، یا SNI متفاوت است.
  • مهلت ACME تمام می‌شود: DNS عمومی، پورت، NAT یا متعادل‌کنندهٔ بار به entrypoint چالش نمی‌رسد.
  • چالش DNS شکست می‌خورد: متغیرهای ارائه‌دهنده، دامنهٔ دسترسی توکن، تأخیر انتشار یا DNS تفکیک‌شده را بررسی کنید.
  • حلقهٔ تغییرمسیر: پراکسی بالادستی TLS را خاتمه می‌دهد، اما هدرهای forwarded یا IPهای مورد اعتماد نادرست‌اند.

خودآزمایی

  1. کدام چالش گواهی wildcard صادر می‌کند؟ DNS-01.
  2. چرا با staging شروع می‌کنیم؟ روند را بدون مصرف سهمیهٔ محیط عملیاتی اعتبارسنجی می‌کند.
  3. مجوز acme.json چه باید باشد؟ 0600.
  4. اثبات کنید: HTTP تغییرمسیر می‌دهد، HTTPS با CA آزمایشگاه تأیید می‌شود و SAN ارائه‌شده درست است.