Cara Mengatasi Certbot Gagal Renew SSL Let's Encrypt di Nginx Ubuntu

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.

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/letsencrypt sebelum 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)ArtinyaPeriksa
Connection refused / timeout saat validasiLet's Encrypt tidak bisa mencapai server lewat port 80Firewall (ufw), port 80 terbuka, DNS menunjuk IP server ini
Invalid response / 404 pada challengeNginx tidak menyajikan file tantanganKonfigurasi server block, redirect yang menelan path challenge
DNS problem / NXDOMAINDomain tidak mengarah ke server iniRecord A/AAAA di DNS
Rate limit / too many requestsTerlalu banyak percobaan gagalBerhenti 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 certificates sebulan 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

SituasiLangkah berikutnya
Dry-run sukses, tetapi renew sungguhan gagalPeriksa log lengkap di /var/log/letsencrypt; kemungkinan sertifikat belum jatuh tempo atau ada domain tambahan yang bermasalah
Satu domain gagal, domain lain suksesFokus ke DNS dan server block domain itu saja; jangan ganggu sertifikat yang sehat
Wildcard (*.domain) gagal renewWildcard memakai tantangan DNS-01, bukan HTTP-01 — periksa plugin DNS dan kredensial API DNS Anda
Rate limit tercapaiBerhenti 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.

Cookie Consent