SSL Certificate Free: Setup Let's Encrypt di VPS

by Marcus Chen
SSL Certificate Free: Setup Let's Encrypt di VPS

Browser Bilang 'Not Secure', User Kabur

Kamu udah deploy aplikasi ke VPS, domain udah pointing, tapi begitu dibuka di browser langsung muncul warning gede: 'Your connection is not private'. User awam langsung panik dan nutup tab. Kalau ini production app, itu masalah serius.

Solusinya jelas: pasang SSL certificate. Tapi begitu googling, kamu nemuin harga SSL dari CA komersial bisa mulai dari $50–$200/tahun. Padahal ada opsi gratis yang dipakai jutaan domain di seluruh dunia: Let's Encrypt.

Let's Encrypt adalah Certificate Authority (CA) nonprofit yang ngasih SSL certificate gratis, valid 90 hari, dan bisa auto-renew. Tool resminya namanya Certbot. Di artikel ini gue bakal tunjukin cara setup ssl certificate free letsencrypt dari nol di VPS Ubuntu dengan Nginx — termasuk gotcha yang sering bikin orang stuck.


Prasyarat Sebelum Mulai

Pastiin kamu punya:

  • VPS dengan Ubuntu 20.04 atau 22.04
  • Nginx sudah terinstall dan jalan
  • Domain yang sudah pointing ke IP VPS kamu (A record sudah propagate)
  • Akses root atau user dengan sudo

Cek dulu A record kamu sudah benar:

nslookup yourdomain.com
# atau
dig yourdomain.com A +short

Harus return IP VPS kamu. Kalau belum, tunggu propagasi DNS dulu — bisa 5 menit sampai 48 jam tergantung TTL.


Install Certbot di Ubuntu

Certbot sekarang direkomendasikan install via snap, bukan apt langsung. Ini karena versi snap selalu up-to-date.

# Update sistem dulu
sudo apt update && sudo apt upgrade -y

# Install snapd kalau belum ada
sudo apt install snapd -y

# Install certbot via snap
sudo snap install --classic certbot

# Buat symlink supaya bisa dipanggil dari mana saja
sudo ln -s /snap/bin/certbot /usr/bin/certbot

# Verifikasi
certbot --version
# Output: certbot 2.x.x

Kalau kamu masih pakai Ubuntu 18.04 atau mau pakai apt:

sudo apt install certbot python3-certbot-nginx -y

Tapi snap lebih disarankan untuk production.


Konfigurasi Nginx Sebelum Minta Certificate

Sebelum jalanin Certbot, pastiin Nginx kamu punya server block yang benar untuk domain tersebut. Certbot butuh ini untuk verifikasi kepemilikan domain.

Buat file konfigurasi Nginx:

sudo nano /etc/nginx/sites-available/yourdomain.com

Isi dengan:

server {
    listen 80;
    listen [::]:80;

    server_name yourdomain.com www.yourdomain.com;

    root /var/www/yourdomain;
    index index.html index.php;

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

Aktifkan dan test:

# Buat symlink ke sites-enabled
sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/

# Test syntax Nginx
sudo nginx -t
# Output: syntax is ok

# Reload Nginx
sudo systemctl reload nginx

Pastiin port 80 terbuka di firewall:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw status

Minta SSL Certificate Free dari Let's Encrypt

Sekarang bagian utamanya. Certbot punya plugin Nginx yang bisa otomatis modifikasi config kamu:

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

Certbot bakal tanya beberapa hal:

Enter email address (used for urgent renewal and security notices):
> kamu@email.com

Agree to terms of service? (Y)es/(N)o:
> Y

Would you like to share your email with EFF?
> N (pilihan bebas)

Please choose whether or not to redirect HTTP traffic to HTTPS:
1: No redirect
2: Redirect - Make all requests redirect to secure HTTPS access
> 2

Pilih opsi 2 supaya semua traffic HTTP otomatis redirect ke HTTPS.

Kalau berhasil, outputnya:

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/yourdomain.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/yourdomain.com/privkey.pem
This certificate expires on 2025-09-15.

Congratulations! You have successfully enabled HTTPS on https://yourdomain.com

Buka domain kamu di browser — sekarang ada gembok hijau, warning hilang.


Verifikasi dan Cek Konfigurasi Nginx Hasil Certbot

Certbot otomatis modifikasi file Nginx kamu. Lihat hasilnya:

cat /etc/nginx/sites-available/yourdomain.com

Sekarang isinya jadi lebih lengkap:

server {
    listen 80;
    server_name yourdomain.com www.yourdomain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name yourdomain.com www.yourdomain.com;

    root /var/www/yourdomain;
    index index.html index.php;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

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

Certbot udah handle redirect HTTP → HTTPS dan nge-point ke file certificate yang benar.


Setup Auto-Renew Certificate

Ini bagian yang sering dilupain. Certificate Let's Encrypt valid 90 hari. Kalau lupa renew, site kamu bakal kena warning lagi.

Certbot via snap udah otomatis setup systemd timer untuk renew. Cek:

sudo systemctl status snap.certbot.renew.timer

Kalau statusnya active, kamu aman. Certbot bakal cek dua kali sehari dan renew kalau certificate tinggal kurang dari 30 hari.

Test dry-run untuk pastiin proses renew bakal jalan:

sudo certbot renew --dry-run

Output yang kamu mau:

Congratulations, all simulated renewals succeeded:
  /etc/letsencrypt/live/yourdomain.com/fullchain.pem (success)

Kalau install via apt (bukan snap), tambahkan cron job manual:

sudo crontab -e

Tambahkan baris ini:

0 3 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload nginx"

Ini bakal jalanin certbot setiap hari jam 3 pagi. --post-hook pastiin Nginx reload setelah certificate diperbarui.


Gotcha yang Sering Bikin Stuck

1. DNS Belum Propagate

Error paling umum:

DNS problem: NXDOMAIN looking up A for yourdomain.com

Solusi: tunggu DNS propagasi dulu. Cek dengan dig yourdomain.com A +short harus return IP VPS kamu.

2. Port 80 Diblokir Firewall atau Cloud Provider

Certbot pakai HTTP challenge di port 80. Kalau port 80 diblokir di security group (AWS, GCP, DigitalOcean), verifikasi gagal.

# Cek apakah port 80 bisa diakses dari luar
curl -I http://yourdomain.com

Kalau timeout, buka port 80 di firewall cloud provider kamu, bukan cuma ufw.

3. Rate Limit Let's Encrypt

Let's Encrypt punya rate limit: 5 certificate per domain per minggu. Kalau kamu berkali-kali gagal dan coba lagi, bisa kena limit ini.

Pakai flag --dry-run dulu untuk test sebelum request certificate beneran:

sudo certbot --nginx --dry-run -d yourdomain.com

4. Wildcard Certificate Butuh DNS Challenge

Kalau kamu mau SSL untuk *.yourdomain.com (wildcard), prosesnya beda — butuh DNS challenge, bukan HTTP challenge:

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

Certbot bakal minta kamu tambah TXT record ke DNS. Ini nggak bisa auto-renew tanpa plugin DNS provider (ada untuk Cloudflare, DigitalOcean, dll).

5. Nginx Tidak Reload Setelah Renew

Certificate udah diperbarui tapi browser masih lihat certificate lama? Nginx belum reload. Pastiin post-hook ada:

sudo certbot renew --post-hook "systemctl reload nginx"

Atau tambahkan ke /etc/letsencrypt/renewal/yourdomain.com.conf:

[renewalparams]
post_hook = systemctl reload nginx

Bonus: Cek SSL Grade di SSL Labs

Setelah setup, cek kualitas SSL kamu di ssllabs.com/ssltest. Setup default Certbot + Nginx biasanya dapat grade A.

Kalau mau push ke A+, tambahkan HSTS header di Nginx:

server {
    listen 443 ssl;
    # ... config lainnya ...

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
}

Reload Nginx:

sudo nginx -t && sudo systemctl reload nginx

Yang Gue Lakuin di Setup Production

Setup ssl certificate free letsencrypt ini yang gue pakai di semua VPS personal dan client. Beberapa hal yang selalu gue lakuin:

  1. Test dry-run dulu sebelum request certificate beneran — hindari buang rate limit.
  2. Verifikasi auto-renew dengan --dry-run segera setelah setup, jangan tunggu 90 hari baru tau ada masalah.
  3. Pakai Cloudflare sebagai DNS — kalau mau wildcard certificate, this guide untuk Cloudflare bikin auto-renew wildcard jadi mungkin.
  4. Monitor expiry dengan tool seperti UptimeRobot yang bisa alert kalau SSL mau expired.

Langkah lanjutan: kalau kamu punya banyak domain dan capek setup satu-satu, lihat Caddy — web server yang handle SSL otomatis tanpa perlu Certbot sama sekali. Tapi itu topik untuk artikel berikutnya.

Kalau ada error spesifik yang kamu temuin waktu setup, drop di kolom komentar — gue bakal bantu debug.