Kenapa SSL Wildcard Perlu Diotomatisasi?
SSL wildcard dipakai untuk mengamankan satu domain utama dan banyak subdomain level pertama. Contohnya, sertifikat untuk example.com dan *.example.com bisa dipakai untuk app.example.com, api.example.com, billing.example.com, dan subdomain lain tanpa membuat sertifikat satu per satu.
Masalahnya, sertifikat Let's Encrypt hanya berlaku sekitar 90 hari. Kalau renewal dikerjakan manual, biasanya baru ingat saat browser sudah menampilkan peringatan SSL expired. Cara yang lebih aman adalah memakai Certbot dengan DNS challenge Cloudflare, lalu renewal berjalan otomatis.
Tutorial ini dikembangkan dari catatan pustaka internal: SSL Wildcard Otomatis (Cloudflare + Certbot). Contoh domain di artikel ini memakai example.com. Saat praktik, ganti semua contoh domain dengan domain asli Anda.
Gambaran Alur Kerja
Untuk wildcard certificate, Let's Encrypt perlu membuktikan bahwa kita mengontrol DNS domain. Karena itu metode HTTP challenge biasa tidak cukup. Kita memakai DNS-01 challenge, lalu Certbot akan membuat TXT record sementara di Cloudflare melalui API token.
- Buat API token Cloudflare dengan permission minimal.
- Install Certbot dan plugin DNS Cloudflare di server.
- Simpan token di file credential yang permission-nya dikunci.
- Issue sertifikat wildcard dengan DNS challenge.
- Pasang sertifikat ke Nginx.
- Tambahkan deploy hook supaya Nginx reload setelah renewal.
- Test renewal dengan dry run.
Prasyarat Sebelum Mulai
Pastikan domain sudah memakai nameserver Cloudflare. Kalau domain belum aktif di Cloudflare, Certbot tidak akan bisa membuat TXT record untuk validasi. Server contoh di artikel ini memakai Ubuntu Server atau Debian-based server.
- Server Linux dengan akses sudo.
- Domain sudah ada di Cloudflare.
- Nginx sudah terpasang, atau minimal Anda tahu file server block yang akan memakai sertifikat.
- Port 80 dan 443 tetap disarankan terbuka untuk layanan web, walaupun validasi wildcard-nya lewat DNS.
- Jam server sinkron, misalnya lewat systemd-timesyncd atau chrony.
1. Buat API Token di Cloudflare
Masuk ke Cloudflare Dashboard, lalu buka menu profil pengguna. Jalurnya biasanya My Profile, masuk ke API Tokens, lalu pilih Create Token. Gunakan Create Custom Token supaya permission-nya tidak terlalu luas.
Permission minimal yang diperlukan:
Zone:DNS:Edituntuk membuat dan menghapus TXT record validasi.Zone:Zone:Readuntuk membaca informasi zone.
Pada bagian zone resource, pilih Include, lalu Specific zone, kemudian pilih domain yang akan dibuatkan SSL wildcard. Jangan memberi akses ke semua zone kalau hanya butuh satu domain.
Setelah token dibuat, salin token sekali saja dan simpan sementara di tempat aman. Token ini nanti dimasukkan ke server. Jangan commit token ke repo Git, jangan tempel di dokumentasi publik, dan jangan kirim lewat chat yang tidak terenkripsi.
2. Install Certbot dan Plugin Cloudflare
Di Ubuntu atau Debian, install plugin Certbot untuk Cloudflare dari repository paket OS:
sudo apt-get update
sudo apt-get install -y certbot python3-certbot-dns-cloudflare
Setelah install, cek apakah plugin terbaca:
certbot plugins | grep -i cloudflare
Kalau output menampilkan dns-cloudflare, berarti Certbot sudah bisa memakai Cloudflare sebagai DNS challenge provider.
3. Simpan Token Cloudflare dengan Permission Aman
Buat folder khusus untuk credential Certbot. Artikel sumber memakai lokasi /root/.secrets/certbot/cloudflare.ini, dan pola ini sudah tepat karena file token hanya perlu dibaca oleh root saat Certbot berjalan.
sudo mkdir -p /root/.secrets/certbot
sudo tee /root/.secrets/certbot/cloudflare.ini >/dev/null <<'EOF'
dns_cloudflare_api_token=ISI_TOKEN_CLOUDFLARE_ANDA
EOF
sudo chmod 600 /root/.secrets/certbot/cloudflare.ini
Pastikan permission file benar:
sudo ls -l /root/.secrets/certbot/cloudflare.ini
Permission yang diharapkan kurang lebih -rw-------. Kalau file masih bisa dibaca user lain, Certbot biasanya akan memberi warning karena credential terlalu terbuka.


4. Issue Sertifikat Wildcard Pertama Kali
Ganti example.com dengan domain Anda. Untuk wildcard, gunakan dua nama domain: domain utama dan wildcard subdomain. Domain utama tetap perlu didaftarkan supaya sertifikat juga valid untuk root domain.
sudo certbot certonly \
--non-interactive \
--agree-tos \
--register-unsafely-without-email \
--dns-cloudflare \
--dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini \
--dns-cloudflare-propagation-seconds 30 \
--cert-name example-com-wildcard \
-d example.com \
-d '*.example.com'
Opsi pentingnya:
certonly: hanya mengambil sertifikat, tidak otomatis mengubah konfigurasi Nginx.--dns-cloudflare: validasi dilakukan lewat DNS Cloudflare.--dns-cloudflare-propagation-seconds 30: memberi waktu agar TXT record terbaca DNS publik.--cert-name: memberi nama folder sertifikat yang rapi dan mudah dikenali.
Untuk production yang dipakai banyak orang, lebih rapi memakai email admin:
sudo certbot certonly \
--non-interactive \
--agree-tos \
--email [email protected] \
--dns-cloudflare \
--dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini \
--dns-cloudflare-propagation-seconds 30 \
--cert-name example-com-wildcard \
-d example.com \
-d '*.example.com'
5. Cek Lokasi File Sertifikat
Kalau berhasil, Certbot akan membuat folder di /etc/letsencrypt/live/example-com-wildcard/. File yang paling sering dipakai Nginx adalah:
fullchain.pem: sertifikat lengkap beserta chain.privkey.pem: private key, wajib dijaga.
Cek dengan perintah berikut:
sudo certbot certificates
Pastikan nama domain utama dan wildcard muncul di daftar certificate names.
6. Pasang Sertifikat ke Nginx
Buka file server block Nginx untuk domain Anda. Contoh minimalnya seperti ini:
server {
listen 443 ssl http2;
server_name example.com *.example.com;
ssl_certificate /etc/letsencrypt/live/example-com-wildcard/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example-com-wildcard/privkey.pem;
root /var/www/example/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
Kalau Anda punya beberapa aplikasi di subdomain berbeda, setiap server block bisa memakai file certificate yang sama selama domainnya masih masuk cakupan *.example.com.
Setelah edit konfigurasi, selalu test dulu:
sudo nginx -t
sudo systemctl reload nginx
Jangan langsung restart Nginx tanpa nginx -t. Kalau ada typo, layanan web bisa turun.
7. Tambahkan Auto Reload Nginx Saat Renewal
Certbot biasanya sudah memasang timer systemd untuk renewal otomatis. Yang perlu kita tambahkan adalah hook supaya Nginx reload setelah sertifikat baru berhasil diperpanjang.
echo 'deploy-hook = systemctl reload nginx' | sudo tee -a /etc/letsencrypt/renewal/example-com-wildcard.conf
Alternatif yang lebih terstruktur adalah membuat file hook di folder deploy:
sudo mkdir -p /etc/letsencrypt/renewal-hooks/deploy
sudo tee /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh >/dev/null <<'EOF'
#!/bin/sh
systemctl reload nginx
EOF
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
Pilih salah satu pendekatan. Jangan menumpuk hook reload berkali-kali kalau tidak perlu.
8. Test Auto Renew
Jalankan dry run untuk memastikan renewal tidak hanya benar di teori:
sudo certbot renew --dry-run
Kalau keluar pesan bahwa semua simulated renewals berhasil, alur renewal sudah aman. Kalau gagal, jangan tunggu sampai sertifikat expired. Perbaiki token, permission, atau DNS propagation saat itu juga.
9. Validasi dari Browser dan Terminal
Setelah Nginx reload, cek dari browser dan dari terminal:
curl -Iv https://example.com
curl -Iv https://app.example.com
Perhatikan bagian issuer, subject, dan tanggal expired. Untuk cek detail lebih dalam, gunakan OpenSSL:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates
Kalau subdomain baru belum diarahkan ke server, SSL bisa valid tetapi websitenya tetap tidak terbuka karena DNS A/AAAA record belum ada. Bedakan masalah sertifikat dan masalah routing DNS.
10. Operasional Rutin
Beberapa command yang berguna untuk maintenance:
sudo certbot certificates
sudo systemctl list-timers | grep certbot
sudo journalctl -u certbot --since "7 days ago" --no-pager
Kalau API token Cloudflare diganti, update file credential lalu ulangi dry run:
sudo nano /root/.secrets/certbot/cloudflare.ini
sudo certbot renew --dry-run
Kalau server memakai firewall ketat, pastikan outbound HTTPS ke API Cloudflare dan Let's Encrypt tidak diblokir.
Troubleshooting yang Sering Terjadi
Unable to load plugin dns-cloudflare
Plugin belum terinstall atau Certbot yang dipakai berasal dari environment berbeda. Install ulang paket plugin:
sudo apt-get install -y python3-certbot-dns-cloudflare
certbot plugins | grep -i cloudflare
Authentication error
Biasanya token salah, token sudah dihapus, atau permission token kurang. Buat token baru dengan permission Zone:DNS:Edit dan Zone:Zone:Read untuk zone yang tepat. Setelah itu update cloudflare.ini dan jalankan dry run.
DNS problem atau validasi TXT tidak ditemukan
Pastikan domain yang dipilih di token sama dengan domain yang diminta Certbot. Naikkan propagation seconds kalau DNS lambat:
--dns-cloudflare-propagation-seconds 60
Untuk sebagian kasus, 30 detik cukup. Untuk zone yang lambat, 60 sampai 120 detik lebih aman.
Nginx gagal reload setelah ganti sertifikat
Jalankan:
sudo nginx -t
sudo journalctl -u nginx -n 80 --no-pager
Kesalahan yang sering muncul adalah path sertifikat salah, titik koma Nginx hilang, atau server block bentrok.
Browser masih menampilkan sertifikat lama
Pastikan Nginx sudah reload, domain mengarah ke server yang benar, dan tidak ada reverse proxy lain di depan server yang masih memakai sertifikat berbeda. Jika memakai Cloudflare proxy orange cloud, cek juga mode SSL/TLS Cloudflare.
Catatan Keamanan
- Jangan simpan token Cloudflare di repo Git.
- Permission credential wajib ketat, minimal
600. - Gunakan token per zone, bukan global API key.
- Rotate token kalau pernah terlihat di terminal sharing, screenshot, log publik, atau repo.
- Batasi akses root/server hanya untuk operator yang memang perlu mengelola sertifikat.
Checklist Sampai Selesai
- Domain sudah aktif di Cloudflare.
- API token Cloudflare dibuat dengan permission minimal.
- Plugin
python3-certbot-dns-cloudflareterinstall. - File
cloudflare.inisudah permission600. - Sertifikat wildcard berhasil dibuat.
- Nginx memakai
fullchain.pemdanprivkey.pemyang benar. nginx -tsukses.certbot renew --dry-runsukses.- Domain utama dan subdomain sudah dites lewat browser atau
curl -Iv.
Kalau semua checklist di atas sudah aman, setup SSL wildcard otomatis sudah siap dipakai untuk production. Setelah itu penambahan subdomain baru jadi lebih sederhana: cukup arahkan DNS dan konfigurasi aplikasi/Nginx, tanpa perlu request sertifikat baru untuk setiap subdomain.