Let’s Encrypt #
Sebelum tahun 2016, mengaktifkan HTTPS pada situs web adalah proses yang rumit dan mahal. Kita harus membeli sertifikat dari Certificate Authority (CA) komersial, mengunggah berkas secara manual, melakukan verifikasi kepemilikan yang lambat, dan membayar biaya tahunan yang tidak murah. Hal ini berubah sejak kehadiran Let’s Encrypt, sebuah Certificate Authority yang gratis, otomatis, dan terbuka.
Let’s Encrypt memungkinkan kita memperoleh sertifikat TLS tepercaya secara instan yang diakui oleh semua browser modern di dunia. Ditambah dengan tool Certbot, proses penerbitan, instalasi di Nginx, hingga pembaruan sertifikat sebelum kedaluwarsa dapat diotomatiskan 100%. Di artikel ini, kita akan membedah secara tuntas cara kerja protokol ACME, instalasi Certbot, berbagai metode verifikasi (challenges), konfigurasi manual maupun otomatis di Nginx, pembaruan otomatis yang andal, hingga pembuatan sertifikat wildcard menggunakan DNS challenge.
Bagaimana Let’s Encrypt Bekerja? (Protokol ACME) #
Let’s Encrypt menggunakan protokol ACME (Automatic Certificate Management Environment) untuk mengotomatiskan interaksi antara server kita (klien ACME) dan server Let’s Encrypt (CA).
Agar Let’s Encrypt bersedia menerbitkan sertifikat untuk domain kita (misalnya example.com), server Let’s Encrypt harus memverifikasi bahwa kita benar-benar memiliki kendali atas domain tersebut. Verifikasi ini dilakukan melalui metode yang disebut Challenge (Tantangan). Dua jenis challenge yang paling umum digunakan adalah:
- HTTP-01 Challenge: Let’s Encrypt meminta klien ACME (Certbot) untuk menempatkan berkas teks acak khusus di jalur (path) tertentu pada web server kita, yaitu di bawah direktori
/.well-known/acme-challenge/. Let’s Encrypt kemudian akan melakukan panggilan HTTP (port 80) ke alamathttp://example.com/.well-known/acme-challenge/[token]. Jika berkas tersebut ditemukan dan isinya cocok, kepemilikan domain dinyatakan sah. - DNS-01 Challenge: Let’s Encrypt meminta kita membuat record DNS baru bertipe TXT dengan nama
_acme-challenge.example.comyang berisi nilai acak tertentu. Let’s Encrypt kemudian akan menanyakan server DNS domain kita. Jika record TXT tersebut cocok, domain dinyatakan terverifikasi. Metode ini wajib digunakan jika kita ingin menerbitkan Wildcard Certificate (sertifikat yang mencakup seluruh subdomain, misalnya*.example.com).
Alur Kerja HTTP-01 Challenge #
Berikut adalah alur komunikasi detail saat menggunakan HTTP-01 challenge untuk memverifikasi kepemilikan domain:
sequenceDiagram
autonumber
actor Certbot as Certbot Client (Server Kita)
actor LE as Let's Encrypt CA Server
actor Nginx as Nginx Web Server
Certbot->>LE: Meminta sertifikat untuk domain.com (HTTP-01)
LE->>Certbot: Mengirimkan token tantangan unik
Certbot->>Nginx: Menulis file token ke /.well-known/acme-challenge/[token]
Note over LE: Melakukan verifikasi dari luar via Internet
LE->>Nginx: HTTP GET http://domain.com/.well-known/acme-challenge/[token]
Nginx->>LE: Mengembalikan isi file token (HTTP 200 OK)
LE->>LE: Memvalidasi kecocokan token
LE->>Certbot: Mengirimkan sertifikat digital terbitan baruAlur Kerja DNS-01 Challenge #
Berikut adalah alur komunikasi saat menerbitkan sertifikat menggunakan DNS-01 challenge (biasanya untuk domain wildcard):
sequenceDiagram
autonumber
actor Certbot as Certbot Client (Server Kita)
actor LE as Let's Encrypt CA Server
actor DNS as Layanan DNS API (Cloudflare/Route53)
Certbot->>LE: Meminta sertifikat untuk *.domain.com (DNS-01)
LE->>Certbot: Mengirimkan nilai TXT record yang dibutuhkan
Certbot->>DNS: Membuat record TXT _acme-challenge.domain.com otomatis via API
Note over DNS: Menunggu proses sinkronisasi DNS secara global
LE->>DNS: Melakukan query DNS TXT untuk _acme-challenge.domain.com
DNS->>LE: Mengembalikan nilai TXT record
LE->>LE: Memvalidasi kecocokan nilai record
Certbot->>DNS: Menghapus record TXT _acme-challenge.domain.com (Pembersihan)
LE->>Certbot: Mengirimkan sertifikat digital wildcard terbitan baruLangkah 1: Instalasi Certbot di Server #
Sebelum mulai meminta sertifikat, kita perlu menginstal Certbot beserta plugin Nginx di sistem operasi server kita.
Ubuntu / Debian (Rekomendasi via Snapd) #
Situs resmi Certbot sangat merekomendasikan instalasi menggunakan Snapd untuk memastikan kita selalu mendapatkan versi Certbot terbaru:
# Pastikan snapd terpasang dan diperbarui
sudo apt update
sudo apt install snapd -y
sudo snap install core; sudo snap refresh core
# Hapus instalasi certbot bawaan apt lama (jika ada)
sudo apt remove certbot -y
# Instal Certbot menggunakan Snap
sudo snap install --classic certbot
# Buat symbolic link agar perintah certbot bisa diakses secara global
sudo ln -s /snap/bin/certbot /usr/bin/certbot
CentOS / Rocky Linux / AlmaLinux #
# Aktifkan repositori EPEL
sudo dnf install epel-release -y
# Instal Certbot dan plugin Nginx
sudo dnf install certbot python3-certbot-nginx -y
Langkah 2: Metode Penerbitan Sertifikat SSL #
Ada beberapa cara untuk meminta sertifikat dari Let’s Encrypt menggunakan Certbot. Kita harus memilih metode yang paling sesuai dengan kebutuhan infrastruktur kita.
Metode A: Penerbitan dan Konfigurasi Otomatis (--nginx)
#
Ini adalah cara termudah dan paling direkomendasikan jika kita ingin prosesnya berjalan instan. Certbot akan memverifikasi domain, mengunduh sertifikat, mengedit konfigurasi Nginx kita secara otomatis untuk memasang sertifikat tersebut, dan menambahkan aturan pengalihan (redirect) HTTP ke HTTPS.
Sebelum menjalankan perintah ini, pastikan kita sudah membuat server block HTTP (port 80) biasa di Nginx dengan direktif server_name yang mengarah ke domain tujuan:
# Konfigurasi awal Nginx di /etc/nginx/conf.d/example.com.conf
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html;
}
Jalankan perintah pengujian konfigurasi dan jalankan Certbot:
sudo nginx -t && sudo systemctl reload nginx
# Jalankan Certbot dengan plugin Nginx
sudo certbot --nginx -d example.com -d www.example.com
Proses interaktif akan dimulai:
- Email: Masukkan alamat email kita (digunakan untuk notifikasi jika ada masalah perpanjangan atau sertifikat hampir kedaluwarsa).
- ToS: Setujui syarat dan ketentuan (Terms of Service).
- Newsletter: Pilih apakah ingin membagikan email kita dengan Electronic Frontier Foundation (EFF).
- Redirect: Certbot akan menanyakan apakah kita ingin mengalihkan semua trafik HTTP ke HTTPS secara otomatis (sangat disarankan pilih opsi 2: Redirect).
Certbot akan otomatis memodifikasi file konfigurasi Nginx kita, menambahkan baris SSL, mengarahkan ke sertifikat baru, dan me-reload Nginx.
Metode B: Hanya Mengunduh Sertifikat (certonly)
#
Jika kita memiliki arsitektur konfigurasi Nginx kustom yang kompleks, kita mungkin tidak ingin Certbot mengotori atau mengubah file konfigurasi Nginx kita secara otomatis. Kita bisa menggunakan opsi certonly untuk sekadar mengunduh file sertifikat, lalu menulis konfigurasi Nginx secara manual.
1. Menggunakan Metode Webroot (--webroot)
#
Metode ini sangat cocok untuk web server produksi karena tidak memerlukan downtime. Certbot akan meletakkan file verifikasi sementara di direktori webroot situs kita, lalu Let’s Encrypt akan mengunduhnya.
Kita harus memastikan Nginx mengizinkan akses ke direktori tersembunyi /.well-known/:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/html;
# Izinkan akses Let's Encrypt Challenge
location ~ /.well-known/acme-challenge {
allow all;
}
}
Jalankan Certbot dengan menentukan direktori root situs kita:
sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com
2. Menggunakan Metode Standalone (--standalone)
#
Jika kita belum memiliki web server yang berjalan, atau jika kita ingin meminta sertifikat sebelum mengonfigurasi Nginx, kita bisa menggunakan metode standalone. Certbot akan membuat web server mini sendiri pada port 80 untuk membalas tantangan Let’s Encrypt.
[!WARNING] Karena metode standalone membutuhkan port 80, kita harus mematikan service Nginx terlebih dahulu jika Nginx sedang berjalan:
# Matikan Nginx sementara
sudo systemctl stop nginx
# Minta sertifikat
sudo certbot certonly --standalone -d example.com -d www.example.com
# Nyalakan kembali Nginx
sudo systemctl start nginx
Langkah 3: Konfigurasi Manual Nginx untuk Let’s Encrypt #
Setelah menggunakan metode certonly, sertifikat kita akan disimpan di direktori aman /etc/letsencrypt/live/.
Jika nama domain kita adalah example.com, kita akan menemukan file-file berikut di folder /etc/letsencrypt/live/example.com/:
cert.pem: Hanya berisi sertifikat server kita.chain.pem: Hanya berisi sertifikat intermediate CA.privkey.pem: Berkas Private Key server kita (sangat rahasia).fullchain.pem: Berkas gabungan daricert.pemdanchain.pemsecara berurutan.
[!IMPORTANT] Di Nginx, kita wajib menggunakan berkas
fullchain.pemsebagai nilai direktifssl_certificate, bukancert.pem. Jika kita hanya menggunakancert.pem, browser pengguna tidak akan dapat melakukan verifikasi rantai kepercayaan (Chain of Trust) dan akan memunculkan error keamanan.
Berikut adalah konfigurasi Nginx manual yang direkomendasikan untuk produksi:
# Server Block HTTPS
server {
listen 443 ssl;
server_name example.com www.example.com;
# Sertifikat Let's Encrypt
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Protokol & Cipher Suite yang Aman
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
# Optimasi Session Cache
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
# Redirect HTTP ke HTTPS
server {
listen 80;
server_name example.com www.example.com;
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}
location / {
return 301 https://$host$request_uri;
}
}
Langkah 4: Penerbitan Wildcard Certificate (DNS-01 Challenge) #
Sertifikat wildcard (*.example.com) sangat berguna jika kita mengelola banyak subdomain dinamis (misalnya blog.example.com, shop.example.com, api.example.com) menggunakan satu sertifikat tunggal.
Karena verifikasi HTTP-01 tidak dapat digunakan untuk membuktikan kepemilikan nama domain ber-wildcard secara umum, Let’s Encrypt mewajibkan penggunaan DNS-01 Challenge.
Cara Manual (Tanpa API DNS) #
Jika kita jarang memperbarui sertifikat atau DNS provider kita tidak memiliki API, kita bisa melakukan verifikasi secara manual:
sudo certbot certonly --manual --preferred-challenges dns -d example.com -d "*.example.com"
Certbot akan berhenti dan menampilkan instruksi untuk masuk ke panel DNS domain kita:
- Buat record DNS baru bertipe TXT.
- Nama/Host:
_acme-challenge.example.com. - Value/Content: Nilai string acak panjang yang ditampilkan di terminal oleh Certbot.
- Tunggu beberapa saat (sekitar 1-5 menit) agar DNS tersebar secara global, lalu tekan tombol Enter di terminal untuk memverifikasi.
Cara Otomatis (Menggunakan API Cloudflare) #
Proses manual di atas memiliki kelemahan besar: kita tidak bisa mengotomatiskan perpanjangan sertifikat, karena setiap 90 hari kita harus memasukkan TXT record baru secara manual.
Solusi terbaik adalah menggunakan plugin DNS API. Sebagai contoh, jika domain kita dikelola di Cloudflare, kita bisa mengotomatiskan langkah ini:
# Instal plugin DNS Cloudflare untuk Certbot
sudo snap set certbot trust-plugin-with-root=ok
sudo snap install certbot-dns-cloudflare
Buat berkas kredensial rahasia Cloudflare API Token di server kita (misalnya di /etc/letsencrypt/cloudflare.ini):
# Isi berkas /etc/letsencrypt/cloudflare.ini
dns_cloudflare_api_token = 1234567890abcdefghijklmnopqrstuvwxyz_TOKEN_ANDA
Batasi hak akses file kredensial ini:
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
Jalankan Certbot untuk mendapatkan sertifikat wildcard secara otomatis:
sudo certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
-d example.com \
-d "*.example.com"
Certbot akan otomatis membuat TXT record di Cloudflare via API, melakukan verifikasi ke Let’s Encrypt, dan menghapus TXT record tersebut setelah sukses. Proses ini berjalan 100% otomatis di latar belakang!
Langkah 5: Otomatisasi Perpanjangan (Auto-Renewal) #
Sertifikat Let’s Encrypt hanya berlaku selama 90 hari. Kebijakan ini dibuat demi alasan keamanan (membatasi kerusakan jika private key bocor) dan untuk mendorong otomatisasi penuh di seluruh dunia. Let’s Encrypt merekomendasikan kita memperbarui sertifikat setiap 60 hari (ketika sisa masa berlaku tinggal 30 hari).
Saat kita menginstal Certbot melalui Snap atau apt, sistem secara otomatis memasang Systemd Timer (atau Cron Job di distro lama) untuk memeriksa kelayakan perpanjangan sertifikat dua kali sehari.
Kita bisa memverifikasi bahwa timer perpanjangan otomatis telah aktif di server kita:
# Cek daftar timer systemd yang aktif
sudo systemctl list-timers | grep certbot
Melakukan Simulasi Perpanjangan (Dry Run) #
Untuk memastikan proses perpanjangan otomatis berjalan dengan lancar tanpa ada kendala firewall atau DNS di masa depan, kita wajib melakukan simulasi:
sudo certbot renew --dry-run
Jika simulasi berakhir dengan tulisan “Congratulations, all renewals succeeded”, berarti otomatisasi kita sudah aman.
Mengonfigurasi Reload Nginx Otomatis (Post-Renewal Hooks) #
Saat sertifikat diperbarui di latar belakang, berkas sertifikat baru akan ditulis ke disk. Namun, Nginx tidak akan memuat sertifikat baru tersebut sampai service Nginx di-reload. Kita tentu tidak ingin Nginx tetap menyajikan sertifikat lama yang sudah kedaluwarsa hanya karena kita lupa me-reload server.
Kita bisa mengonfigurasi Certbot untuk memuat ulang Nginx secara otomatis sesaat setelah perpanjangan sertifikat berhasil menggunakan Deploy Hook:
# Daftarkan deploy hook ke konfigurasi renewal Certbot
sudo certbot renew --deploy-hook "systemctl reload nginx"
Atau jika kita mengedit konfigurasi perpanjangan per domain di dalam file /etc/letsencrypt/renewal/example.com.conf, kita bisa menambahkan baris berikut di bagian paling bawah di bawah [renewalparams]:
renew_hook = systemctl reload nginx
Tabel Troubleshooting Let’s Encrypt #
Berikut adalah daftar masalah umum yang sering dihadapi saat memasang sertifikat Let’s Encrypt beserta solusinya:
| Masalah | Kemungkinan Penyebab | Cara Mengatasi |
|---|---|---|
Failed authorization procedure / HTTP 404 | Let’s Encrypt gagal mengunduh file verifikasi dari port 80 server kita. Biasanya karena file root salah atau ada konfigurasi redirect HTTPS yang memblokir akses HTTP sebelum verifikasi selesai. | Pastikan direktori root di konfigurasi Nginx port 80 mengarah ke direktori yang tepat, dan lokasi /.well-known/acme-challenge/ tidak dialihkan ke HTTPS sebelum proses verifikasi selesai. |
Connection refused / Timeout | Port 80 atau 443 pada server kita tertutup oleh firewall (UFW, iptables, AWS Security Group, atau Cloudflare proxy). | Pastikan firewall mengizinkan trafik inbound port 80 dan 443 dari alamat IP mana saja di internet: sudo ufw allow 80/tcpsudo ufw allow 443/tcp |
Rate Limits Exceeded | Let’s Encrypt membatasi pembuatan sertifikat baru (misalnya maksimal 50 sertifikat per domain terdaftar per minggu, atau maksimal 5 sertifikat duplikat per minggu). | Jika sedang melakukan uji coba konfigurasi, selalu gunakan flag --staging agar tidak memicu rate limit lingkungan produksi. Sertifikat staging tidak dipercayai browser, tetapi tidak memiliki batas rate limit yang ketat. |
DNS problem: NXDOMAIN looking up TXT for _acme-challenge | Record TXT yang dibuat untuk verifikasi DNS-01 belum tersebar ke server DNS Let’s Encrypt saat validasi dilakukan. | Jika menggunakan cara manual, tunggu beberapa menit sebelum menekan Enter. Jika menggunakan API, pastikan API token memiliki hak akses edit DNS yang benar dan waktu tunggu (propagation-seconds) disetel lebih lama (misalnya --dns-cloudflare-propagation-seconds 60). |
CAA record prevents issuance | Domain kita memiliki DNS record bertipe CAA (Certification Authority Authorization) yang melarang Let’s Encrypt menerbitkan sertifikat untuk domain tersebut. | Hapus record CAA tersebut dari panel DNS domain kita, atau tambahkan aturan CAA baru yang mengizinkan Let’s Encrypt: example.com. IN CAA 0 issue "letsencrypt.org". |
Ringkasan #
- Snapd untuk Certbot: Gunakan metode instalasi Snap untuk menjamin Certbot selalu menggunakan versi terbaru dengan fitur keamanan terkini.
- Gunakan
fullchain.pem: Selalu gunakanfullchain.pemuntukssl_certificateNginx agar browser dapat memverifikasi rantai sertifikat dengan sukses.- Gunakan Webroot untuk Zero Downtime: Pilih metode
--webrootjika ingin mengunduh sertifikat tanpa perlu mematikan service Nginx di server produksi.- Gunakan API untuk Wildcard: Otomatisasikan pembuatan sertifikat wildcard dengan plugin API DNS (seperti Cloudflare) agar perpanjangan otomatis tetap dapat berjalan tanpa intervensi manual.
- Jangan Lupa Reload Hook: Selalu pasang deploy hook
systemctl reload nginxagar Nginx memuat ulang sertifikat baru secara otomatis setelah perpanjangan sukses.
← Sebelumnya: Self-Signed Certificate Berikutnya: Optimasi Konfigurasi SSL →