# Otomasi Pembaruan Sertifikat SSL dengan Certbot dan NGINX

> Setup HTTPS otomatis dengan Certbot dan Let's Encrypt di Ubuntu, konfigurasi NGINX sebagai TLS terminator, dan tidak perlu lagi memperbarui sertifikat SSL secara manual.

URL: https://www.matthewswong.com/id/blog/automate-ssl-certbot-nginx/

- Author: Matthews Wong (https://www.matthewswong.com/id/about/)
- Published: 2025-06-10
- Updated: 2026-10-17
- Category: DevOps

Mengelola sertifikat SSL secara manual adalah salah satu tugas yang terasa mudah sampai sertifikat kedaluwarsa di produksi pukul 2 pagi hari Minggu. Let's Encrypt dan Certbot mengotomasi seluruh siklus hidup — penerbitan, validasi, instalasi, dan pembaruan — sehingga kedaluwarsa sertifikat SSL benar-benar tidak perlu lagi dikhawatirkan. Setelah ini disiapkan di setiap DigitalOcean Droplet atau GCP Compute Engine instance yang Anda kelola, tidak ada lagi sertifikat yang harus diperbarui secara manual. Panduan ini mencakup setup lengkap, konfigurasi NGINX untuk TLS yang kuat, dan pipeline pembaruan otomatis.

## Cara Kerja Let's Encrypt dan Certbot

Let's Encrypt adalah Certificate Authority (CA) gratis yang menerbitkan sertifikat Domain Validation (DV) yang berlaku selama 90 hari. Masa berlaku singkat ini disengaja — memaksakan otomasi dan membatasi jendela kerusakan untuk sertifikat yang dikompromikan. Certbot adalah klien ACME resmi yang berkomunikasi dengan API Let's Encrypt. ACME (Automatic Certificate Management Environment) adalah protokol yang membuktikan Anda mengontrol domain sebelum CA menerbitkan sertifikat. Certbot mendukung dua jenis tantangan: HTTP-01 (membuat file sementara di /.well-known/acme-challenge/ di web server Anda) dan DNS-01 (membuat TXT record DNS sementara). HTTP-01 lebih sederhana dan berfungsi untuk sebagian besar setup.

### Siklus Hidup Sertifikat 90 Hari

Sertifikat Let's Encrypt berlaku 90 hari. Pendekatan pembaruan yang direkomendasikan Certbot adalah menjalankan `certbot renew` dua kali sehari (melalui systemd timer atau cron). Perintah ini memeriksa apakah sertifikat mana pun berada dalam 30 hari dari kedaluwarsa — jika tidak, ia tidak melakukan apa pun. Jika pembaruan diperlukan, perintah ini menjalankan ulang tantangan ACME, mendapatkan sertifikat baru, dan menjalankan deploy hook yang dikonfigurasi (seperti memuat ulang NGINX). Pendekatan ini berarti sertifikat biasanya diperbarui ketika tersisa 30 hari, memberi Anda buffer 30 hari bahkan jika proses pembaruan gagal selama beberapa hari.

### Batas Rate yang Perlu Diketahui

Let's Encrypt memberlakukan batas rate untuk mencegah penyalahgunaan. Yang paling relevan untuk developer: 50 sertifikat per domain terdaftar per minggu, dan 5 percobaan validasi gagal per jam per akun per hostname. Batas ini penting selama setup awal saat Anda mungkin mengiterasi konfigurasi. Selalu gunakan flag `--dry-run` saat menguji perintah certbot — dry run menggunakan environment staging Let's Encrypt (batas rate terpisah) dan tidak menerbitkan sertifikat nyata. Hanya hapus `--dry-run` ketika Anda yakin konfigurasi sudah benar.

> Jika server Anda berada di belakang cloud firewall atau Droplet firewall DigitalOcean, pastikan port 80 (HTTP) terbuka selama tantangan HTTP-01 ACME. Plugin NGINX Certbot sementara melayani file tantangan di port 80. Setelah tantangan berhasil, Anda bisa membatasi port 80 hanya untuk redirect ke HTTPS. Certbot akan terus menangani pembaruan secara otomatis karena plugin NGINX mengelola eksposur port 80 sementara selama proses pembaruan.

## Instalasi dan Sertifikat Awal

Plugin NGINX untuk Certbot adalah pendekatan yang direkomendasikan — secara otomatis mengedit konfigurasi NGINX Anda untuk menambahkan path sertifikat, mengaktifkan HTTPS, dan menambahkan redirect HTTP ke HTTPS. Setelah menjalankan `certbot --nginx`, konfigurasi NGINX Anda akan memiliki direktif `ssl_certificate` dan `ssl_certificate_key` yang mengarah ke `/etc/letsencrypt/live/'<'domain>/`. Plugin juga menambahkan `include /etc/letsencrypt/options-ssl-nginx.conf` yang menyediakan konfigurasi cipher suite dan protokol default yang aman yang dikelola oleh Let's Encrypt.

### Deploy Hook untuk Reload NGINX

Setelah Certbot memperbarui sertifikat, NGINX perlu memuat ulang untuk mengambil sertifikat baru. Tanpa deploy hook, sertifikat lama tetap dimuat di memori sampai NGINX dimulai ulang secara manual atau server reboot. Certbot menjalankan script di `/etc/letsencrypt/renewal-hooks/deploy/` setelah setiap pembaruan berhasil. Buat script yang menjalankan `nginx -t && systemctl reload nginx` — tes konfigurasi memastikan konfigurasi NGINX yang rusak tidak mematikan server Anda selama pembaruan otomatis.

> **Port 80 Harus Terbuka Selama Pembaruan**

> Kesalahan paling umum saat menyiapkan Certbot adalah menjalankan perintah `certbot certonly` atau `certbot --nginx` awal ketika port 80 diblokir. Tantangan HTTP-01 gagal secara diam-diam dari perspektif pengguna — Anda mendapat hit batas rate dan harus menunggu satu jam sebelum mencoba lagi. Periksa bahwa `curl http://domain-anda.com/.well-known/acme-challenge/test` mengembalikan sesuatu (bahkan 404 dari NGINX) sebelum menjalankan Certbot. Juga, jangan pernah menghapus `/etc/letsencrypt/` — direktori ini berisi kunci akun dan konfigurasi pembaruan sertifikat. Backup ke DigitalOcean Spaces atau GCP Cloud Storage.

## Pengerasan Konfigurasi TLS

Konfigurasi NGINX default Certbot aman tetapi tidak optimal untuk rating A+ di SSL Labs. Untuk mencapai skor keamanan maksimum: nonaktifkan TLS 1.0 dan 1.1 (pertahankan hanya TLSv1.2 dan TLSv1.3), konfigurasi cipher suite yang kuat yang memprioritaskan ECDHE dengan forward secrecy, aktifkan HSTS dengan max-age 2 tahun dan includeSubDomains, tambahkan OCSP stapling untuk mengurangi latensi pada TLS handshake, dan konfigurasi file parameter Diffie-Hellman (minimum 2048-bit, 4096-bit lebih disukai). Buat file DH params dengan `openssl dhparam -out /etc/nginx/dhparam.pem 2048` — ini membutuhkan 1-2 menit di VPS tipikal.

## Wildcard Certificate dengan Tantangan DNS-01

Untuk lingkungan dengan beberapa subdomain (api.example.com, app.example.com, admin.example.com), wildcard certificate (`*.example.com`) lebih efisien daripada sertifikat individual per subdomain. Wildcard certificate membutuhkan tantangan DNS-01, yang membuktikan kepemilikan domain dengan membuat DNS TXT record daripada menyajikan file melalui HTTP. Untuk DNS DigitalOcean, install plugin `python3-certbot-dns-digitalocean` dan buat file kredensial dengan API token DigitalOcean Anda. Tantangan dan pembaruan kemudian sepenuhnya otomatis tanpa akses HTTP yang diperlukan.

## Monitoring Kedaluwarsa Sertifikat

Bahkan dengan pembaruan otomatis, Anda harus memonitor kedaluwarsa sertifikat sebagai jaring pengaman. Tambahkan probe Prometheus Blackbox Exporter yang memeriksa kedaluwarsa sertifikat TLS untuk setiap domain dan alert ketika kedaluwarsa kurang dari 21 hari. Alternatifnya, Let's Encrypt mengirim email pengingat kedaluwarsa ke alamat yang terdaftar dengan Certbot. Untuk pendekatan belt-and-suspenders, gunakan layanan seperti certificate.transparency.dev atau monitor uptime dengan pemeriksaan kedaluwarsa TLS (UptimeRobot tier gratis menyertakan fitur ini) sebagai saluran notifikasi sekunder di luar monitoring stack Anda.

## Sumber & Bacaan Lanjutan

- EFF — Dokumentasi Resmi Certbot — https://certbot.eff.org/docs/
- Let's Encrypt — FAQ dan Dokumentasi — https://letsencrypt.org/docs/faq/
- NGINX — Mengonfigurasi HTTPS Server — https://nginx.org/en/docs/http/configuring_https_servers.html

## Source links

- https://certbot.eff.org/docs/
- https://letsencrypt.org/docs/faq/
- https://nginx.org/en/docs/http/configuring_https_servers.html

## FAQ

### Mengapa Let's Encrypt menerbitkan sertifikat yang hanya berlaku 90 hari, bukan setahun atau lebih?

Masa berlaku 90 hari yang singkat ini disengaja. Ini memaksakan otomasi karena pembaruan manual menjadi tidak praktis, sekaligus membatasi jendela kerusakan jika private key pernah dikompromikan. Ekspektasinya adalah Certbot yang menangani pembaruan secara otomatis, sehingga masa berlaku singkat ini merupakan fitur, bukan keterbatasan.

### Bagaimana cara Certbot menghindari batas rate Let's Encrypt saat setup awal?

Selalu gunakan flag --dry-run saat menguji perintah Certbot. Dry run menggunakan environment staging Let's Encrypt yang memiliki batas rate terpisah dan tidak menerbitkan sertifikat nyata. Hapus --dry-run hanya setelah Anda yakin konfigurasi sudah benar. Batas produksi yang paling relevan adalah 50 sertifikat per domain terdaftar per minggu dan 5 percobaan validasi gagal per jam per hostname.

### Mengapa deploy hook diperlukan dan apa yang harus dijalankannya?

Setelah Certbot memperbarui sertifikat, NGINX tetap menyajikan sertifikat lama dari memori sampai dimuat ulang. Tanpa deploy hook, sertifikat yang diperbarui sudah tersimpan di disk tetapi tidak pernah diambil. Buat script di /etc/letsencrypt/renewal-hooks/deploy/ yang menjalankan nginx -t && systemctl reload nginx — tes konfigurasi ini memastikan konfigurasi NGINX yang rusak tidak mematikan server selama pembaruan otomatis.

### Kapan sebaiknya menggunakan wildcard certificate dibanding sertifikat individual per subdomain?

Wildcard certificate (*.example.com) lebih efisien ketika Anda memiliki banyak subdomain seperti api, app, dan admin di bawah domain yang sama. Namun, wildcard certificate memerlukan tantangan DNS-01, bukan HTTP-01 yang lebih sederhana. Untuk DNS DigitalOcean, install plugin python3-certbot-dns-digitalocean dan sediakan file kredensial API token — pembaruan kemudian berjalan sepenuhnya otomatis tanpa akses HTTP yang diperlukan.

### Monitoring apa yang tetap perlu dipasang meski pembaruan sudah diotomasi?

Otomasi pembaruan bukan alasan untuk berhenti memonitor kedaluwarsa sertifikat. Artikel ini merekomendasikan probe Prometheus Blackbox Exporter yang memberi alert ketika kedaluwarsa kurang dari 21 hari. Sebagai saluran sekunder di luar monitoring stack Anda, monitor uptime dengan pemeriksaan kedaluwarsa TLS — seperti UptimeRobot tier gratis — memberikan jaring pengaman tambahan di samping email pengingat kedaluwarsa dari Let's Encrypt sendiri.

---

- HTML version: https://www.matthewswong.com/id/blog/automate-ssl-certbot-nginx/
- English: https://www.matthewswong.com/en/blog/automate-ssl-certbot-nginx/
- Site index for agents: https://www.matthewswong.com/llms.txt
- Sitemap: https://www.matthewswong.com/sitemap.xml
- API description (OpenAPI): https://www.matthewswong.com/openapi.json
