Sains & Teknologi

Cara Membuat SSL Gratis di Proxmox + Auto Renew

Cara Membuat SSL Gratis di Proxmox + Auto Renew

Cara Membuat SSL Gratis di Proxmox dengan Cloudflare, Let's Encrypt dan HestiaCP (Auto Renew)

Memiliki VPS atau server Proxmox untuk menjalankan aplikasi berbasis web memberikan fleksibilitas tinggi. Namun, salah satu masalah yang sering dialami administrator server adalah sertifikat SSL kedaluwarsa, HTTPS tidak aman, atau Let's Encrypt gagal diperpanjang secara otomatis.

Masalah tersebut juga sering terjadi pada server yang menggunakan HestiaCP, Nginx, Apache, dan Cloudflare sebagai pengelola DNS.

Kabar baiknya, kita dapat membuat SSL gratis menggunakan Let's Encrypt dan Cloudflare DNS API, termasuk sertifikat wildcard untuk melindungi banyak subdomain sekaligus.

Dalam tutorial ini, Nugasin akan membahas proses pembuatan SSL gratis berdasarkan pengalaman troubleshooting pada server aplikasi berbasis LXC Proxmox, Debian, dan HestiaCP.

Panduan mencakup proses instalasi Certbot, konfigurasi Cloudflare API Token, pembuatan SSL wildcard, pemasangan sertifikat di HestiaCP, auto-renew, hingga solusi error yang sering ditemukan.

Apa Itu SSL dan Mengapa Penting untuk VPS?

SSL atau TLS merupakan teknologi yang digunakan untuk mengamankan komunikasi antara browser pengguna dan server melalui enkripsi.

Ketika SSL sudah terpasang dengan benar, website dapat diakses menggunakan protokol HTTPS.

Bagi pengelola aplikasi billing, SIAKAD, CRM, toko online, maupun dashboard administrasi, HTTPS sangat penting untuk menjaga keamanan komunikasi antara pengguna dan server.

Beberapa manfaat SSL antara lain:

  • Mengenkripsi komunikasi antara browser dan server.
  • Mencegah peringatan sertifikat tidak valid pada browser.
  • Mendukung keamanan cookie dan autentikasi aplikasi.
  • Membantu meningkatkan kepercayaan pengunjung website.
  • Mendukung fitur browser yang memerlukan koneksi aman.

Catatan: SSL tidak otomatis melindungi aplikasi dari malware, SQL injection, web shell, atau kebocoran database. Keamanan server tetap memerlukan perlindungan tambahan.

Mengenal Let's Encrypt, Cloudflare, Certbot, dan HestiaCP

1. Let's Encrypt

Let's Encrypt adalah Certificate Authority yang menyediakan sertifikat TLS secara gratis melalui protokol ACME.

Sertifikat Let's Encrypt dapat diperpanjang secara otomatis sehingga administrator tidak harus menerbitkan sertifikat baru secara manual setiap kali masa berlakunya mendekati habis.

2. Cloudflare DNS

Cloudflare merupakan layanan DNS dan keamanan website yang dapat digunakan untuk memvalidasi kepemilikan domain.

Dengan metode DNS-01 Challenge, Certbot membuat TXT record khusus melalui Cloudflare API, kemudian Let's Encrypt melakukan verifikasi terhadap record tersebut.

Keunggulan DNS-01 adalah proses validasi tidak bergantung pada kondisi aplikasi web atau ketersediaan HTTP port 80.

3. Certbot

Certbot merupakan aplikasi untuk menerbitkan dan memperpanjang sertifikat Let's Encrypt.

Dengan plugin python3-certbot-dns-cloudflare, proses validasi DNS dapat dilakukan otomatis menggunakan Cloudflare API Token.

4. HestiaCP

HestiaCP adalah control panel hosting yang menyediakan pengelolaan web domain, Nginx, Apache, database, email, dan SSL.

Dalam tutorial ini, HestiaCP akan menggunakan sertifikat yang diterbitkan oleh Certbot melalui Cloudflare DNS API.

Persiapan Membuat SSL Gratis di Proxmox

Sebelum memulai, pastikan Anda memiliki akses root ke server atau container yang akan menggunakan SSL.

Komponen Konfigurasi
VirtualisasiProxmox VE
ServerVM atau LXC
Sistem OperasiDebian / Ubuntu
Control PanelHestiaCP
Web ServerNginx + Apache2
DNSCloudflare
SSLLet's Encrypt
ValidasiDNS-01 Challenge
Auto RenewCertbot + Systemd Timer

Dalam contoh ini, kita menggunakan domain:

  • Domain utama: app.example.com
  • Wildcard: *.app.example.com
  • Zona Cloudflare: example.com
  • User HestiaCP: webuser

Silakan mengganti seluruh contoh tersebut dengan domain dan user server masing-masing.

Langkah 1: Install Certbot dan Plugin Cloudflare

Masuk ke console VM atau LXC melalui Proxmox, kemudian jalankan perintah berikut pada Debian atau Ubuntu yang masih didukung:

sudo apt update
sudo apt install -y certbot python3-certbot-dns-cloudflare

Setelah proses instalasi selesai, periksa versi Certbot:

certbot --version

Selanjutnya, periksa plugin yang tersedia:

certbot plugins

Pastikan terdapat plugin berikut:

dns-cloudflare

Jika plugin tersebut muncul, Certbot sudah siap digunakan untuk melakukan validasi domain melalui Cloudflare.

Langkah 2: Membuat Cloudflare API Token

Buka dashboard Cloudflare melalui halaman berikut:

https://dash.cloudflare.com/profile/api-tokens

Kemudian pilih Create Token dan gunakan template Edit Zone DNS.

Atur permission sebagai berikut:

PengaturanNilai
Zone → DNSEdit
Zone → ZoneRead
Zone ResourcesInclude Specific Zone
Zoneexample.com

Gunakan API Token dengan permission terbatas pada zona yang diperlukan.

Menyimpan Cloudflare API Token di Server

Jalankan:

install -d -m 700 /root/.secrets/certbot

nano /root/.secrets/certbot/cloudflare.ini

Masukkan konfigurasi berikut:

dns_cloudflare_api_token = TOKEN_CLOUDFLARE_ANDA

Simpan file dengan menekan Ctrl + O, Enter, kemudian Ctrl + X.

Amankan permission file:

chmod 600 /root/.secrets/certbot/cloudflare.ini

Penting: Jangan menyimpan API Token Cloudflare di direktori public_html atau repository Git.

Langkah 3: Membuat SSL Wildcard Gratis dengan Let's Encrypt

Setelah Certbot dan Cloudflare API Token siap, kita dapat menerbitkan SSL wildcard.

Jalankan perintah berikut:

certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /root/.secrets/certbot/cloudflare.ini \
  --dns-cloudflare-propagation-seconds 60 \
  --cert-name app.example.com \
  -d app.example.com \
  -d '*.app.example.com'

Certbot akan melakukan proses berikut:

  1. Menghubungi server Let's Encrypt.
  2. Membuat TXT record DNS melalui Cloudflare API.
  3. Menunggu propagasi DNS selama waktu yang dikonfigurasi.
  4. Memvalidasi kepemilikan domain.
  5. Menerbitkan sertifikat jika validasi berhasil.

Jika berhasil, sertifikat tersimpan pada:

/etc/letsencrypt/live/app.example.com/

Direktori tersebut berisi:

Nama FileFungsi
cert.pemSertifikat domain
privkey.pemPrivate key
chain.pemIntermediate CA certificate
fullchain.pemSertifikat domain dan chain

Untuk memeriksa sertifikat:

certbot certificates

Perbedaan SSL Wildcard dan SSL Biasa

Sertifikat biasa hanya mencakup nama domain yang dicantumkan dalam sertifikat.

Sertifikat wildcard *.app.example.com dapat digunakan untuk:

  • api.app.example.com
  • billing.app.example.com
  • admin.app.example.com

Namun, wildcard tersebut tidak mencakup subdomain dua tingkat seperti test.api.app.example.com.

Langkah 4: Memasang SSL ke HestiaCP

Setelah sertifikat berhasil diterbitkan, langkah berikutnya adalah memasangnya melalui mekanisme resmi HestiaCP.

Periksa User Pemilik Domain

/usr/local/hestia/bin/v-list-web-domains webuser

/usr/local/hestia/bin/v-list-web-domain \
  webuser app.example.com

Pastikan domain terdaftar pada user HestiaCP yang benar.

Backup Sertifikat Lama

Jika domain sudah menggunakan SSL, buat backup terlebih dahulu:

DOMAIN="app.example.com"
USER="webuser"
BACKUP="/root/ssl-backup-$(date +%Y%m%d-%H%M%S)"

install -d -m 700 "$BACKUP"

cp -a "/home/$USER/conf/web/$DOMAIN/ssl" "$BACKUP/"

Langkah ini melindungi konfigurasi sertifikat sebelumnya jika diperlukan pemulihan.

Siapkan Sertifikat untuk HestiaCP

DOMAIN="app.example.com"
CERT="/etc/letsencrypt/live/$DOMAIN"
DEST="/root/ssl-hestia"

install -d -m 700 "$DEST"

install -m 600 \
  "$CERT/cert.pem" "$DEST/$DOMAIN.crt"

install -m 600 \
  "$CERT/privkey.pem" "$DEST/$DOMAIN.key"

install -m 600 \
  "$CERT/chain.pem" "$DEST/$DOMAIN.ca"

Verifikasi Certificate Authority:

openssl verify \
  -untrusted "$DEST/$DOMAIN.ca" \
  "$DEST/$DOMAIN.crt"

Jika hasilnya OK, sertifikat siap dipasang.

Jika SSL Domain Sudah Aktif

/usr/local/hestia/bin/v-update-web-domain-ssl \
  webuser app.example.com /root/ssl-hestia

Jika SSL Domain Belum Aktif

/usr/local/hestia/bin/v-add-web-domain-ssl \
  webuser app.example.com /root/ssl-hestia same

Perhatian: Gunakan salah satu perintah berdasarkan status SSL domain. Jangan menjalankan keduanya secara bersamaan.

Setelah pemasangan, validasi konfigurasi web server:

nginx -t
apache2ctl configtest

Langkah 5: Memastikan Nginx Menggunakan Sertifikat Baru

Salah satu masalah yang sering terjadi adalah sertifikat terbaru sudah tersimpan, tetapi Nginx masih menyajikan sertifikat lama.

Untuk memeriksanya, jalankan:

echo | openssl s_client \
  -connect 127.0.0.1:443 \
  -servername app.example.com \
  2>/dev/null | openssl x509 \
  -noout -subject -issuer -dates -ext subjectAltName

Jika Nginx tidak menerima koneksi HTTPS pada loopback, ganti 127.0.0.1 dengan IP origin yang benar.

Pastikan tanggal kedaluwarsa dan nama domain sesuai dengan sertifikat yang diterbitkan.

Langkah 6: Membuat Auto Renew SSL di HestiaCP

Agar HestiaCP selalu menggunakan sertifikat terbaru, kita dapat membuat deploy hook Certbot.

Buat direktori:

mkdir -p /etc/letsencrypt/renewal-hooks/deploy

nano /etc/letsencrypt/renewal-hooks/deploy/hestia-ssl.sh

Masukkan script berikut:

#!/bin/bash
set -Eeuo pipefail

DOMAIN="app.example.com"
HESTIA_USER="webuser"
CERT="/etc/letsencrypt/live/$DOMAIN"
DEST="/root/ssl-hestia"
HESTIA="/usr/local/hestia/bin"

if [[ "${RENEWED_LINEAGE:-}" != "$CERT" ]]; then
    exit 0
fi

for FILE in cert.pem privkey.pem chain.pem; do
    test -s "$CERT/$FILE"
done

install -d -m 700 "$DEST"

install -m 600 "$CERT/cert.pem" \
    "$DEST/$DOMAIN.crt"

install -m 600 "$CERT/privkey.pem" \
    "$DEST/$DOMAIN.key"

install -m 600 "$CERT/chain.pem" \
    "$DEST/$DOMAIN.ca"

openssl verify \
    -untrusted "$DEST/$DOMAIN.ca" \
    "$DEST/$DOMAIN.crt"

"$HESTIA/v-update-web-domain-ssl" \
    "$HESTIA_USER" "$DOMAIN" "$DEST"

nginx -t
apache2ctl configtest

echo "SUCCESS: SSL $DOMAIN diperbarui."

Simpan script, kemudian aktifkan:

chmod 700 /etc/letsencrypt/renewal-hooks/deploy/hestia-ssl.sh

Periksa sintaks:

bash -n /etc/letsencrypt/renewal-hooks/deploy/hestia-ssl.sh

Selanjutnya uji sinkronisasi secara manual:

RENEWED_LINEAGE=/etc/letsencrypt/live/app.example.com \
  /etc/letsencrypt/renewal-hooks/deploy/hestia-ssl.sh

Script ini digunakan setelah sertifikat berhasil dipasang dan status SSL HestiaCP sudah aktif.

Langkah 7: Mengaktifkan Certbot Timer

Certbot dapat dijalankan secara otomatis menggunakan systemd timer.

systemctl enable --now certbot.timer

systemctl status certbot.timer --no-pager

Jika status menunjukkan active (waiting), timer telah aktif.

Uji renewal menggunakan:

certbot renew --dry-run

Hasil yang diharapkan:

Congratulations, all simulated renewals succeeded

Pada beberapa versi Certbot lama, deploy hook akan dilewati saat menggunakan dry-run. Karena itu, deploy hook perlu diuji secara terpisah.

Langkah 8: Menghindari Konflik SSL HestiaCP dan Certbot

HestiaCP mempunyai sistem penerbitan Let's Encrypt bawaan. Jika kita menggunakan Certbot Cloudflare sebagai sumber utama renewal, jangan sampai dua mekanisme tersebut memperbarui domain yang sama.

Konfigurasi yang diinginkan adalah:

SSL='yes'
LETSENCRYPT='no'

Namun, ada pelajaran penting dari pengujian nyata: pada konfigurasi HestiaCP tertentu, menghilangkan centang Let's Encrypt lalu menyimpan pengaturan dapat ikut menonaktifkan SSL domain.

Jika hal tersebut terjadi, jangan menerbitkan sertifikat baru. Gunakan file sertifikat yang sudah ada untuk mengaktifkan kembali SSL melalui perintah HestiaCP.

/usr/local/hestia/bin/v-add-web-domain-ssl \
  webuser app.example.com /root/ssl-hestia same

Perintah tersebut hanya digunakan jika SSL domain memang berstatus nonaktif.

Setelah perubahan, periksa kembali sertifikat yang disajikan oleh Nginx.

Troubleshooting SSL Let's Encrypt, Cloudflare dan HestiaCP

1. Mengatasi Error Certificate Authority Not Found

Error ini dapat muncul ketika HestiaCP tidak menemukan rantai Certificate Authority yang diperlukan.

Gunakan format file:

cert.pem    -> domain.crt
privkey.pem -> domain.key
chain.pem   -> domain.ca

Validasi rantai sertifikat menggunakan OpenSSL sebelum melakukan impor.

2. Mengatasi Error Certbot Manual Plugin

Contoh error:

The manual plugin is not working

An authentication script must be provided
with --manual-auth-hook

Masalah ini terjadi ketika sertifikat dikonfigurasi menggunakan manual authenticator tanpa authentication hook untuk renewal otomatis.

Solusinya adalah menggunakan plugin DNS yang mendukung otomatisasi seperti dns-cloudflare.

Pastikan konfigurasi renewal menggunakan:

authenticator = dns-cloudflare

3. Mengatasi Error 404 Saat Install Certbot

Contoh:

Failed to fetch python3-cryptography
404 Not Found

Masalah ini dapat terjadi karena repository tidak sinkron, metadata paket kedaluwarsa, atau versi sistem operasi sudah melewati masa dukungan.

Periksa:

cat /etc/os-release
apt-cache policy python3-cryptography certbot
apt-get update

Jangan langsung menggunakan paket tidak resmi atau melakukan upgrade besar pada server produksi tanpa backup.

4. SSL Sudah Aktif tetapi Website Masih HTTP 500

Kesalahan HTTP 500 tidak selalu disebabkan sertifikat SSL.

Pada studi kasus server aplikasi, SSL telah berhasil diperbaiki, tetapi website masih menampilkan:

HTTP/2 500 Internal Server Error

Setelah log PHP diperiksa, ditemukan pesan:

Failed opening required 'wp-blog-header.php'

File index.php juga mengandung kode yang disamarkan, sementara aplikasi sebenarnya menggunakan framework CodeIgniter.

Dengan membandingkan file menggunakan Git, ditemukan bahwa entry point asli aplikasi berbeda dari file yang sedang dijalankan.

Untuk investigasi awal:

git status --short
git log -5 --oneline -- index.php
git show HEAD:index.php

Jika ditemukan indikasi penyisipan kode berbahaya, buat snapshot atau backup terlebih dahulu, simpan bukti, dan pulihkan kode dari sumber yang telah diverifikasi bersih.

Jangan langsung menjalankan git reset --hard atau menghapus seluruh file mencurigakan tanpa pemeriksaan, karena dapat menghilangkan bukti dan menimpa perubahan penting aplikasi.

FAQ Seputar SSL Gratis di Proxmox

Apakah Let's Encrypt benar-benar gratis?

Ya. Let's Encrypt menyediakan sertifikat TLS gratis. Namun, biaya domain, VPS, atau hosting tetap bergantung pada layanan yang digunakan.

Apakah Cloudflare Free mendukung SSL wildcard?

Ya. Cloudflare dapat digunakan sebagai pengelola DNS untuk validasi DNS-01 sehingga Let's Encrypt dapat menerbitkan sertifikat wildcard.

Apakah Certbot wajib dipasang pada host Proxmox?

Tidak. Certbot dapat dipasang langsung pada container LXC atau VM yang menjalankan aplikasi.

Apakah SSL bisa diperpanjang otomatis?

Bisa. Gunakan Certbot dengan autentikasi DNS yang mendukung renewal otomatis, systemd timer, dan deploy hook jika sertifikat perlu dipasang ke panel hosting.

Mengapa sertifikat masih expired padahal Certbot berhasil?

Kemungkinan web server masih menggunakan sertifikat lama. Periksa sertifikat yang disajikan Nginx menggunakan OpenSSL.

Mengapa website tetap HTTP 500 setelah SSL diperbaiki?

Karena HTTP 500 berasal dari kesalahan pemrosesan server atau aplikasi. Periksa log PHP, Nginx, Apache, database, serta integritas kode aplikasi.

Kesimpulan

Membuat SSL gratis menggunakan Proxmox, Cloudflare DNS API, Let's Encrypt, Certbot, dan HestiaCP merupakan solusi fleksibel untuk mengamankan aplikasi web.

Dengan metode DNS-01, validasi domain dapat berjalan tanpa bergantung pada kondisi aplikasi web. Metode ini cocok untuk sertifikat biasa maupun wildcard.

Agar konfigurasi berjalan baik dalam jangka panjang, pastikan:

  • Sertifikat diterbitkan untuk domain yang benar.
  • Nginx atau Apache menggunakan sertifikat terbaru.
  • Timer Certbot aktif.
  • Deploy hook berhasil diuji.
  • Tidak ada dua proses renewal yang saling bertabrakan.
  • Backup dan keamanan aplikasi tetap diperhatikan.

Dengan konfigurasi yang tepat, administrator dapat mengurangi pekerjaan manual dan risiko SSL kedaluwarsa pada server produksi.

Untuk tutorial Linux, VPS, keamanan website, dan pengembangan aplikasi lainnya, kunjungi Nugasin.com.

Referensi Resmi