All Newbie, Semua Tentang Ilmu

Recent

Cara Pasang SSL Let's Encrypt di Nginx (Ubuntu 24.04)

HTTPS bukan lagi opsional: browser menandai situs tanpa TLS sebagai Not secure, dan Google memakainya sebagai salah satu sinyal peringkat. Let's Encrypt memberi sertifikat gratis yang berlaku 90 hari dan diperbarui otomatis oleh Certbot.

Deretan rak server di pusat data CERN tempat layanan web berjalan
Foto: Hugovanmeijeren, CC BY-SA 3.0, via Wikimedia Commons

Ringkasan singkat

  • Arahkan DNS lebih dulu; ini penyebab gagal tersering.
  • Certbot mengubah konfigurasi Nginx otomatis.
  • Pilih Redirect agar HTTP dialihkan ke HTTPS.
  • Uji pembaruan dengan certbot renew --dry-run.

Panduan ini memakai Ubuntu 24.04 dengan Nginx dan satu domain contoh contoh.com.

Prasyarat

  • Domain aktif, misal dibeli di registrar mana pun.
  • VPS dengan IP publik, port 80 dan 443 terbuka.
  • Nginx sudah terpasang atau akan dipasang di langkah berikut.

1. Arahkan domain ke server

Buat dua record di pengelola DNS:

TypeNameValue
A@IP publik VPS
AwwwIP publik VPS

Verifikasi sebelum melanjutkan — Certbot akan gagal kalau domain belum mengarah ke server ini:

dig +short contoh.com
dig +short www.contoh.com

Kalau hasilnya belum IP yang benar, tunggu propagasi (bisa sampai beberapa jam). Ini penyebab kegagalan paling umum.

Alur HTTPS: browser, DNS, Nginx, Certbot, dan Let’s EncryptBrowserpenggunaDNSA → IP serverNginx :443TLS 1.3Certbottimer harianLet’s EncryptACME :80redirect 301 dari HTTP
Diagram: Alur HTTPS: browser, DNS, Nginx, Certbot, dan Let’s Encrypt

2. Pasang Nginx dan Certbot

sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx
sudo systemctl enable --now nginx
curl -I http://contoh.com

3. Buka firewall

sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status

Nginx Full membuka 80 dan 443 sekaligus. Kalau UFW belum aktif dan kamu memakai firewall penyedia VPS, buka port yang sama di panel mereka.

4. Buat server block

sudo mkdir -p /var/www/contoh.com
sudo nano /etc/nginx/sites-available/contoh.com
server {
    listen 80;
    listen [::]:80;
    server_name contoh.com www.contoh.com;

    root /var/www/contoh.com;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Aktifkan dan uji konfigurasi:

sudo ln -s /etc/nginx/sites-available/contoh.com /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t
sudo systemctl reload nginx

nginx -t harus melaporkan syntax is ok. Jangan reload kalau masih ada error.

5. Terbitkan sertifikat

sudo certbot --nginx -d contoh.com -d www.contoh.com

Certbot akan menanyakan email, persetujuan TOS, dan pilihan redirect. Pilih Redirect agar HTTP dialihkan ke HTTPS.

Setelah selesai, Nginx otomatis diubah untuk memakai sertifikat. Cek hasilnya:

curl -I https://contoh.com
sudo certbot certificates

6. Pastikan pembaruan otomatis

Certbot memasang systemd timer. Periksa:

systemctl list-timers | grep certbot
sudo certbot renew --dry-run

--dry-run menguji proses pembaruan tanpa memakai kuota sertifikat. Kalau perintah ini lolos, pembaruan 90 hari akan berjalan sendiri.

7. Header keamanan dasar

Tambahkan di dalam blok server yang memakai 443:

add_header Strict-Transport-Security "max-age=31536000" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

Uji ulang dengan sudo nginx -t && sudo systemctl reload nginx. HSTS membuat browser menolak HTTP untuk domain ini selama satu tahun — aktifkan hanya setelah HTTPS terbukti stabil.

8. Uji kualitas TLS

Jangan berhenti pada "sudah hijau di browser". Periksa rantai sertifikat dan protokol yang disepakati:

openssl s_client -connect contoh.com:443 -servername contoh.com </dev/null 2>/dev/null | openssl x509 -noout -subject -dates
curl -I https://contoh.com
curl -I http://contoh.com

Perintah kedua harus mengembalikan 301 ke HTTPS, bukan 200. Untuk penilaian menyeluruh, uji domainmu di SSL Labs; target realistis adalah peringkat A dengan TLS 1.2 dan 1.3 aktif.

9. Pilih satu versi domain

Memiliki versi www dan non-www yang sama-sama aktif membuat dua URL untuk isi yang sama. Pilih satu sebagai kanonik dan alihkan yang lain:

server {
    listen 443 ssl;
    server_name www.contoh.com;
    return 301 https://contoh.com$request_uri;
}

Pastikan sertifikat mencakup kedua nama domain, karena redirect tetap terjadi setelah TLS terbentuk. Setelah itu, daftarkan versi kanonik di Search Console agar Google tidak mengindeks keduanya.

10. Simpan konfigurasi

sudo tar czf ~/nginx-$(date +%F).tar.gz /etc/nginx
sudo cp /etc/letsencrypt/renewal/contoh.com.conf ~/renewal-contoh.com.conf

File di /etc/letsencrypt berisi kunci privat — perlakukan arsip ini seperti kata sandi, jangan diunggah ke repositori publik.

11. Menambah subdomain

Pola yang sama berlaku untuk api.contoh.com: tambahkan record A, buat server block baru, lalu terbitkan sertifikatnya.

sudo certbot --nginx -d api.contoh.com

Sertifikat akan dibuat terpisah, sehingga subdomain baru tetap berjalan walau salah satu server block diubah. Kalau jumlahnya banyak, gunakan wildcard:

sudo certbot certonly --manual --preferred-challenges dns -d "*.contoh.com"

Wildcard mewajibkan verifikasi DNS TXT, jadi tidak bisa diperbarui otomatis tanpa plugin DNS registrar. Untuk sebagian besar kebutuhan, sertifikat per subdomain lebih sederhana.

12. HSTS dan preload: kapan berhenti

Header HSTS dengan max-age satu tahun sudah cukup untuk sebagian besar situs. Jangan daftarkan domain ke HSTS preload list kecuali kamu yakin seluruh subdomain — termasuk yang dipakai internal — sudah memakai HTTPS. Preload bersifat permanen di browser dan sulit dibatalkan.

Masalah yang sering muncul

GejalaPenyebabSolusi
Certbot gagal challenge failedDNS belum mengarah ke serverCek dig +short, tunggu propagasi
Connection timed out saat challengePort 80 tertutupsudo ufw allow 'Nginx Full', cek firewall VPS
too many certificates already issuedBatas 5 sertifikat/minggu per domainTunggu, atau uji dengan --dry-run dan --staging
403 Forbidden setelah pasangIzin folder salahsudo chown -R www-data:www-data /var/www/contoh.com
Sertifikat kedaluwarsaTimer tidak berjalansystemctl status certbot.timer, lalu sudo certbot renew

Pertanyaan yang sering diajukan

Apakah Let's Encrypt benar-benar gratis?

Ya, tanpa biaya dan tanpa batas masa pakai, tetapi sertifikatnya hanya berlaku 90 hari. Karena itu pembaruan otomatis wajib dipastikan berjalan.

Bisa untuk banyak domain sekaligus?

Bisa. Tambahkan -d domain2.com pada perintah Certbot, dan pastikan setiap domain punya server block serta DNS yang benar.

Bagaimana kalau memakai Cloudflare?

Matikan proxy (mode DNS only) saat penerbitan pertama, atau gunakan mode Full (strict) setelah sertifikat origin terpasang. Mode Flexible sering menghasilkan redirect loop.

Apakah perlu membeli sertifikat komersial?

Untuk sebagian besar situs tidak. Sertifikat komersial baru relevan untuk kebutuhan garansi, OV/EV, atau organisasi dengan kebijakan internal tertentu.





0 comments:

Post a Comment