Browser menampilkan peringatan sertifikat kedaluwarsa, padahal Anda dulu memasang SSL “otomatis”. Penyebabnya hampir selalu sama: perpanjangan otomatis Certbot gagal diam-diam, dan tidak ada yang menyadarinya sampai sertifikat benar-benar habis. Kabar baiknya, kegagalan ini hampir selalu bisa didiagnosis dari log.
Daftar Isi
- Jawaban Singkat
- Memahami Cara Kerja Renew Otomatis
- Persiapan
- Langkah 1: Periksa Status Sertifikat dan Timer
- Langkah 2: Simulasikan Perpanjangan dan Baca Errornya
- Langkah 3: Perbaiki Penyebab Paling Umum
- Langkah 4: Jalankan Perpanjangan Sungguhan dan Muat Ulang Nginx
- Langkah 5: Cegah Terulang
- Verifikasi Hasil
- Troubleshooting Lanjutan
- FAQ
- Kesimpulan
Jawaban Singkat
Sertifikat Let's Encrypt berlaku 90 hari dan Certbot dipasang dengan timer/cron yang memperbaruinya otomatis sebelum kedaluwarsa. Bila perpanjangan gagal, jalankan certbot renew --dry-run untuk mensimulasikan perpanjangan tanpa mengubah apa pun, baca pesan errornya, perbaiki penyebabnya (biasanya port 80, DNS, atau konfigurasi Nginx), lalu jalankan perpanjangan sungguhan.
Memahami Cara Kerja Renew Otomatis
- Paket Certbot di Ubuntu memasang systemd timer atau cron yang berjalan berkala (umumnya dua kali sehari) dan hanya memperbarui sertifikat yang mendekati kedaluwarsa (dalam 30 hari).
- Perpanjangan memakai tantangan HTTP-01 secara default untuk plugin Nginx: Let's Encrypt meminta file di
/.well-known/acme-challenge/lewat HTTP port 80 dan server Anda harus menyajikannya. - Bila tantangan itu gagal — port tertutup, DNS salah, atau Nginx tidak lagi melayani tantangan tersebut — perpanjangan gagal dan timer akan mencoba lagi di jadwal berikutnya, diam-diam, sampai sertifikat kedaluwarsa.
Persiapan
- Akses SSH dengan hak sudo ke server yang memegang sertifikat.
- Ketahui domain yang sertifikatnya bermasalah dan tanggal kedaluwarsanya.
- Backup direktori
/etc/letsencryptsebelum mengubah konfigurasi sertifikat (direktori ini berisi kunci privat — jaga kerahasiaannya).
Langkah 1: Periksa Status Sertifikat dan Timer
sudo certbot certificates
sudo systemctl status certbot.timer
sudo systemctl list-timers | grep certbot
certbot certificates menunjukkan setiap sertifikat, domain yang dicakupnya, dan tanggal kedaluwarsanya. Bila timer tidak ada atau tidak aktif, Anda menemukan satu penyebab: tidak ada yang menjalankan perpanjangan otomatis. Bila timer aktif tetapi sertifikat tetap tidak diperbarui, lanjut ke simulasi.
Langkah 2: Simulasikan Perpanjangan dan Baca Errornya
sudo certbot renew --dry-run
Perintah ini mensimulasikan perpanjangan untuk semua sertifikat tanpa menyimpan sertifikat baru. Bila hasilnya “all simulated renewals succeeded”, mekanisme perpanjangan Anda sehat — kemungkinan masalahnya ada di timer atau di sertifikat yang belum jatuh tempo saat simulasi. Bila gagal, pesan errornya menunjuk penyebab:
| Pesan error (inti) | Artinya | Periksa |
|---|---|---|
| Connection refused / timeout saat validasi | Let's Encrypt tidak bisa mencapai server lewat port 80 | Firewall (ufw), port 80 terbuka, DNS menunjuk IP server ini |
| Invalid response / 404 pada challenge | Nginx tidak menyajikan file tantangan | Konfigurasi server block, redirect yang menelan path challenge |
| DNS problem / NXDOMAIN | Domain tidak mengarah ke server ini | Record A/AAAA di DNS |
| Rate limit / too many requests | Terlalu banyak percobaan gagal | Berhenti mencoba berulang; tunggu dan perbaiki dulu penyebabnya |
Untuk detail lebih dalam, buka log di /var/log/letsencrypt/letsencrypt.log — log inilah yang membedakan tebakan dari diagnosis.
Langkah 3: Perbaiki Penyebab Paling Umum
Port 80 tertutup. Validasi HTTP-01 membutuhkan port 80 yang bisa dijangkau dari internet, meski situs Anda hanya melayani HTTPS. Periksa firewall:
sudo ufw status
sudo ufw allow 'Nginx Full'
DNS tidak menunjuk server ini. Pastikan record A domain mengarah ke IP server ini:
dig +short domainanda.com A
Bila domain masih menunjuk server lama atau IP berubah setelah migrasi, perpanjangan akan selalu gagal sampai DNS diperbaiki.
Cloudflare memproksi domain. Bila domain diproksi Cloudflare, tantangan HTTP bisa terganggu oleh aturan redirect atau cache. Pilihan praktis: untuk sementara ubah record DNS menjadi DNS-only (tanpa proksi) selama perpanjangan, lalu kembalikan; atau pastikan path /.well-known/acme-challenge/ diteruskan apa adanya ke origin.
Konfigurasi Nginx berubah. Bila server block diubah manual setelah Certbot pertama kali berjalan, plugin Nginx mungkin tidak lagi menemukan server block yang cocok. Periksa dengan nginx -t dan pastikan server_name sesuai dengan domain sertifikat.
Langkah 4: Jalankan Perpanjangan Sungguhan dan Muat Ulang Nginx
Setelah penyebab diperbaiki dan dry-run berhasil:
sudo certbot renew
sudo nginx -t
sudo systemctl reload nginx
Reload penting: Nginx memuat sertifikat saat start/reload, sehingga sertifikat baru tidak dipakai sampai Nginx di-reload. Paket Certbot modern biasanya menangani reload lewat hook, tetapi verifikasi manual menghilangkan keraguan. Konfirmasi dari browser (gembok dan tanggal kedaluwarsa baru) dan dari certbot certificates.
Langkah 5: Cegah Terulang
- Pastikan timer Certbot aktif dan tidak dinonaktifkan oleh “pembersihan” cron.
- Jadwalkan pemeriksaan
certbot certificatessebulan sekali, atau pasang peringatan kedaluwarsa sertifikat. - Bila memakai hook reload, pastikan hook itu masih ada setelah konfigurasi diubah.
- Jangan menghapus dan membuat ulang sertifikat berulang-ulang saat gagal — itu memicu rate limit Let's Encrypt dan memperburuk keadaan.
Verifikasi Hasil
Perbaikan berhasil bila certbot renew --dry-run sukses, certbot certificates menunjukkan tanggal kedaluwarsa baru (sekitar 90 hari ke depan), browser menampilkan gembok tanpa peringatan, dan timer Certbot aktif. Uji juga dari perangkat lain untuk memastikan bukan cache browser lokal yang menipu.
Troubleshooting Lanjutan
| Situasi | Langkah berikutnya |
|---|---|
| Dry-run sukses, tetapi renew sungguhan gagal | Periksa log lengkap di /var/log/letsencrypt; kemungkinan sertifikat belum jatuh tempo atau ada domain tambahan yang bermasalah |
| Satu domain gagal, domain lain sukses | Fokus ke DNS dan server block domain itu saja; jangan ganggu sertifikat yang sehat |
| Wildcard (*.domain) gagal renew | Wildcard memakai tantangan DNS-01, bukan HTTP-01 — periksa plugin DNS dan kredensial API DNS Anda |
| Rate limit tercapai | Berhenti mencoba; perbaiki penyebabnya dulu, lalu tunggu jendela rate limit berlalu |
FAQ
Berapa lama sertifikat Let's Encrypt berlaku?
90 hari. Itulah kenapa perpanjangan otomatis penting: tanpa timer yang sehat, Anda akan mengulang pekerjaan ini empat kali setahun — atau lupa dan kedaluwarsa.
Apakah dry-run mengubah sertifikat saya?
Tidak. Dry-run hanya mensimulasikan prosesnya dan tidak menyimpan sertifikat baru.
Apakah saya harus me-restart Nginx setelah renew?
Reload sudah cukup dan tidak memutus koneksi yang berjalan. Restart penuh hanya diperlukan bila reload gagal.
Kesimpulan
Certbot yang gagal renew hampir selalu gagal karena alasan yang bisa dibaca: port, DNS, proksi, atau konfigurasi yang berubah. Mulai dari status sertifikat dan timer, simulasikan dengan dry-run, baca lognya, perbaiki satu penyebab, lalu verifikasi dengan sertifikat baru dan gembok browser. Dan setelah pulih, pasang pengingat: sertifikat yang “otomatis” tetap perlu sesekali diperiksa.