Episode ini membahas sertifikat wildcard untuk seluruh subdomain dengan DNS-01 challenge: cara kerja record TXT, integrasi provider DNS seperti Cloudflare dengan API token, konfigurasi environment variable, SAN multi-domain, serta troubleshooting propagation timeout dan resolvers.

Sertifikat wildcard *.example.com melindungi semua subdomain sekaligus — satu sertifikat, tanpa perlu mendaftarkan setiap nama. Episode 16 membahas cara mendapatkannya lewat DNS-01 challenge, satu-satunya challenge yang mendukung wildcard, serta integrasi dengan provider DNS seperti Cloudflare dan Route53.
Tantangannya: DNS-01 butuh kemampuan menulis record TXT di DNS domain kalian secara programatik. Traefik melakukannya lewat library lego, yang mendukung puluhan provider. Di episode ini kita praktikkan dengan Cloudflare sebagai contoh, lengkap dengan konfigurasi environment variable dan troubleshooting.
Challenge HTTP-01 dan TLS-ALPN-01 berjalan per-domain: untuk *.example.com, tidak ada host tunggal yang mewakili wildcard. DNS-01 bekerja di level nama domain: Let's Encrypt meminta kalian meletakkan token di record TXT _acme-challenge.example.com. Dengan mengontrol DNS, kalian membuktikan kepemilikan seluruh domain sekaligus.
Alur lengkapnya:
*.example.com._acme-challenge.example.com di provider DNS.Karena tidak ada koneksi inbound yang dibutuhkan, DNS-01 juga bisa dipakai untuk server di belakang NAT penuh.
Untuk memakai provider Cloudflare, buat API Token dengan izin Zone.DNS:Edit pada zone yang dituju. Simpan token sebagai environment variable — jangan pernah menuliskannya di file konfigurasi yang ter-version control:
services:
traefik:
image: traefik:v3
environment:
- CLOUDFLARE_DNS_API_TOKEN=${CLOUDFLARE_DNS_API_TOKEN}
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./config/traefik.yml:/etc/traefik/traefik.yml:ro
- ./acme.json:/etc/traefik/acme.jsonToken diambil dari .env di host saat docker compose up. Konfigurasi resolver memakai DNS-01 dengan provider Cloudflare:
certificatesResolvers:
letsencrypt:
acme:
email: admin@example.com
storage: /etc/traefik/acme.json
dnsChallenge:
provider: cloudflare
resolvers:
- "1.1.1.1:53"
- "8.8.8.8:53"provider: cloudflare: memberitahu lego provider mana yang dipakai.resolvers: server DNS yang dipakai Let's Encrypt saat memverifikasi record TXT — daftar server yang dapat diakses dan akurat.Untuk provider lain, token env var berbeda tapi polanya sama: ROUTE53_ACCESS_KEY_ID, AZURE_CLIENT_SECRET, GANDI_API_KEY, dan seterusnya. Pola _acme-challenge record disetel otomatis oleh lego.
Satu router bisa meminta sertifikat dengan kombinasi domain spesifik dan wildcard sekaligus:
services:
portal:
image: nginx:alpine
labels:
- traefik.enable=true
- traefik.http.routers.portal.rule=HostRegexp(`{subdomain:[a-z]+}.example.com`)
- traefik.http.routers.portal.entrypoints=websecure
- traefik.http.routers.portal.tls.certresolver=letsencrypt
- traefik.http.routers.portal.tls.domains[0].main=example.com
- traefik.http.routers.portal.tls.domains[0].sans=*.example.com
- traefik.http.routers.portal.service=portal-svc
- traefik.http.services.portal-svc.loadbalancer.server.port=80Rule HostRegexp membuat semua subdomain *.example.com masuk router ini. Label tls.domains[0].main meminta sertifikat untuk example.com plus SAN wildcard *.example.com. Traefik menggabungkan permintaan dari semua router yang memakai resolver yang sama, sehingga domain yang tumpang tindih tidak diterbitkan duplikat.
Kesalahan paling umum pada DNS-01 adalah propagation timeout: record TXT sudah dibuat, tapi server verifikasi belum melihatnya karena DNS belum menyebar. Penanganannya:
dnsPropagationTimeout pada dnsChallenge (default 60 detik untuk sebagian provider) menjadi 2-3 menit._acme-challenge rendah — kalau TTL 1 jam, verifikasi bisa gagal sampai record lama hilang.dig apakah record TXT sudah terlihat dari perspektif internet:dig TXT _acme-challenge.example.com
dig TXT _acme-challenge.example.com @1.1.1.1Perintah dig pertama memakai resolver default, yang kedua memaksa resolver 1.1.1.1 — jika hasilnya berbeda, propagation belum selesai.
Jika resolvers tidak diisi, lego memakai resolvers bawaan yang mungkin tidak melihat perubahan terbaru. Daftarkan resolver tepercaya seperti di atas. Untuk domain yang dikelola di banyak zone, pastikan token punya izin pada zone yang benar — error unauthorized hampir selalu soal scope token, bukan konfigurasi Traefik.
Tip
Gunakan subdomain + wildcard campuran dengan bijak: sertifikat wildcard *.example.com tidak menutupi example.com itu sendiri maupun a.b.example.com. Tambahkan main dan sans secara eksplisit sesuai kebutuhan.
Inti yang harus dibawa pulang:
_acme-challenge di provider DNS via lego.Zone.DNS:Edit lewat env var.HostRegexp plus tls.domains dengan main dan sans.dig.Di episode 17 selanjutnya kita akan membahas custom certificates & mutual TLS — sertifikat dari file provider dengan hot reload, certificate stores dan SNI routing, serta mTLS untuk autentikasi klien berbasis sertifikat. Di sinilah Traefik berubah dari pengaman publik menjadi gerbang tepercaya untuk API internal.