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 |
|---|---|
| Virtualisasi | Proxmox VE |
| Server | VM atau LXC |
| Sistem Operasi | Debian / Ubuntu |
| Control Panel | HestiaCP |
| Web Server | Nginx + Apache2 |
| DNS | Cloudflare |
| SSL | Let's Encrypt |
| Validasi | DNS-01 Challenge |
| Auto Renew | Certbot + 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:
| Pengaturan | Nilai |
|---|---|
| Zone → DNS | Edit |
| Zone → Zone | Read |
| Zone Resources | Include Specific Zone |
| Zone | example.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:
- Menghubungi server Let's Encrypt.
- Membuat TXT record DNS melalui Cloudflare API.
- Menunggu propagasi DNS selama waktu yang dikonfigurasi.
- Memvalidasi kepemilikan domain.
- Menerbitkan sertifikat jika validasi berhasil.
Jika berhasil, sertifikat tersimpan pada:
/etc/letsencrypt/live/app.example.com/
Direktori tersebut berisi:
| Nama File | Fungsi |
|---|---|
| cert.pem | Sertifikat domain |
| privkey.pem | Private key |
| chain.pem | Intermediate CA certificate |
| fullchain.pem | Sertifikat 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.



