Cara Install Certbot Apache di Ubuntu 24.04
Panduan instalasi Certbot 2.9.0 via apt untuk Apache di Ubuntu 24.04. Pelajari solusi error ServerName yang sering menghambat proses penerbitan sertifikat.
Apa yang Anda bangun
Sebuah situs Apache pada Ubuntu 24.04 yang merespons melalui HTTPS dengan sertifikat Let's Encrypt gratis yang dipercaya browser — diterbitkan oleh Certbot, dan diperbarui secara otomatis oleh systemd timer yang berjalan di latar belakang. Perintah untuk menjalankan proses ini hanya satu baris. Semua kegagalan terjadi sebelum baris tersebut: vhost tanpa ServerName, port 80 tertutup pada firewall penyedia, atau DNS masih mengarah ke server lama. Oleh karena itu, panduan ini fokus pada prasyarat dan mencantumkan pesan kesalahan spesifik untuk setiap kesalahan tersebut.
Dua catatan cakupan. Jika web server Anda adalah nginx, alurnya serupa tetapi plugin dan konfigurasinya berbeda — gunakan versi nginx dari panduan ini. Dan jika target yang Anda amankan hanya bersifat internal — seperti panel admin pada alamat privat atau server staging yang tidak diakses orang lain — Anda tidak memerlukan otoritas sertifikat; sertifikat self-signed lebih sederhana dan dapat bekerja secara offline.
Prasyarat, dan tiga penyebab kegagalan sebelum Certbot berjalan
- Apache sudah melayani situs Anda melalui HTTP biasa. Plugin Apache Certbot mengedit situs yang sudah ada; plugin ini tidak membuat situs baru. Jika Anda memulai dari VPS kosong, bangun LAMP stack di Ubuntu 24.04 terlebih dahulu sebelum melanjutkan — panduan ini adalah bab TLS yang belum ada pada panduan tersebut.
- Domain publik dengan A record yang mengarah ke alamat VPS Anda. Tantangan HTTP-01 Let's Encrypt mengharuskan server validasi mereka terhubung ke server Anda melalui internet: tidak bisa menggunakan homelab dengan NAT tanpa port forward, tidak bisa menggunakan nama
.local, dan tidak bisa menggunakan IP saja.dig +short example.comharus mengembalikan alamat VPS Anda, dan jika Anda baru saja mengubah DNS dalam satu jam terakhir, tunggu hingga TTL rekaman lama berakhir sebelum melakukan proses. - Jika rekaman AAAA ada, rekaman tersebut harus benar. Let's Encrypt lebih mengutamakan IPv6 jika rekaman AAAA dipublikasikan, sehingga rekaman AAAA yang kedaluwarsa akan menyebabkan validasi gagal meskipun
curldari laptop Anda — yang kemungkinan menggunakan IPv4 — berjalan lancar. Publikasikan AAAA yang benar atau jangan publikasikan sama sekali.
Port 80 dan 443 harus terbuka di ufw dan di firewall jaringan penyedia layanan Anda — sebagian besar panel hosting memiliki firewall kedua yang tidak terlihat oleh OS. HTTP-01 melakukan validasi khusus melalui port 80; Anda tidak dapat menjalankan ini hanya dengan port 443.
sudo ufw allow "Apache Full"
sudo ufw statusJika semua hal di atas sudah siap, seluruh proses hanya memakan waktu lima belas menit, dan sepuluh menit di antaranya digunakan untuk membaca.
Snap atau apt Certbot? Pada 24.04, apt akhirnya sudah memadai
Certbot pindah ke distribusi snap beberapa tahun lalu karena alasan kuat: paket distro sudah usang. Ubuntu 20.04 menyertakan Certbot 0.40 dan tidak pernah diperbarui, sehingga proyek tersebut kesulitan memperbaiki bug lama. Pada 24.04 alasan tersebut sudah tidak ada — repositori menyertakan Certbot 2.9.0, rilis generasi terbaru, dan unattended-upgrades terus memberikan pembaruan. Rekomendasi saya untuk OS ini: gunakan apt. Anda tidak perlu menjalankan daemon snapd, plugin Apache terinstal dalam transaksi yang sama, dan timer pembaruan terintegrasi dengan systemd menggunakan cara Debian standar.
sudo apt update
sudo apt install -y certbot python3-certbot-apache
certbot --versionHasil yang benar: certbot 2.9.0. Paket python3-certbot-apache adalah plugin yang membaca dan mengedit konfigurasi Apache Anda — tanpa paket ini, certbot --apache akan gagal dengan The requested apache plugin does not appear to be installed.
Snap tetap menjadi pilihan tepat dalam dua kondisi: Anda ingin menggunakan Certbot terbaru segera setelah rilis, atau Anda memerlukan plugin DNS yang hanya didistribusikan sebagai snap (beberapa plugin penyedia certbot-dns-* hanya tersedia dalam format ini). Jika Anda memilih cara tersebut:
sudo apt remove -y certbot python3-certbot-apache
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbotApa pun yang Anda pilih, jangan jalankan keduanya. Dua instalasi akan menyebabkan dua penjadwal pembaruan berebut /etc/letsencrypt, dan certbot yang ditemukan shell Anda di PATH mungkin bukan yang mengelola sertifikat Anda. Baris apt remove di atas bukan sekadar dekorasi tambahan.
Edit vhost Certbot harus sudah ada — ServerName adalah kunci utama
certbot --apache bekerja dengan mencari virtual host port-80 yang ServerName atau ServerAlias miliknya cocok dengan setiap domain -d yang Anda masukkan. Proses ini membuktikan kontrol atas domain tersebut, lalu menulis salinan SSL untuk vhost tersebut. Jika tidak ada ServerName yang cocok, maka tidak ada kecocokan — dan 000-default.conf bawaan Ubuntu menyertakan ServerName dalam keadaan dikomentari. Baris yang dikomentari tersebut adalah alasan paling umum mengapa satu perintah besar dalam panduan ini gagal.
Jadi sebelum menyentuh Certbot, berikan situs tersebut vhost berbasis nama yang benar. Buat /etc/apache2/sites-available/example.com.conf:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com
ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>Aktifkan dan pastikan Apache dapat membaca serta mengarahkan nama tersebut ke vhost tersebut:
sudo a2ensite example.com.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
sudo apache2ctl -Sconfigtest harus mencetak Syntax OK. Jika ia juga mencetak AH00558: apache2: Could not reliably determine the server's fully qualified domain name, itu adalah peringatan mengenai ServerName global, bukan vhost Anda — tidak berbahaya di sini, dan dapat diabaikan dengan echo "ServerName $(hostname -f)" | sudo tee /etc/apache2/conf-available/servername.conf && sudo a2enconf servername && sudo systemctl reload apache2.
Output -S adalah pemeriksaan yang penting. Anda memerlukan baris seperti port 80 namevhost example.com (/etc/apache2/sites-enabled/example.com.conf:1) dengan alias www.example.com di bawahnya — Apache melaporkan symlink sites-enabled yang sebenarnya dibaca, bukan file yang Anda edit di sites-available. Jika example.com tidak terdaftar pada port 80, Certbot juga tidak akan menemukannya.
Terbitkan sertifikat: certbot --apache
sudo certbot --apache -d example.com -d www.example.comJalankan pertama kali akan menanyakan tiga hal: alamat email (digunakan untuk akun ACME dan pemberitahuan mendesak dari CA; Let's Encrypt tidak lagi mengirim peringatan kedaluwarsa, jadi Anda harus memantau pembaruan sendiri), persetujuan terhadap ketentuan Let's Encrypt, dan apakah Anda ingin membagikan email ke EFF. Tidak ada lagi pertanyaan pengalihan (redirect): sejak Certbot 2.0, installer Apache mengalihkan HTTP ke HTTPS secara default, sesuai dengan kebutuhan Anda. Gunakan flag --no-redirect jika Anda benar-benar membutuhkan HTTP biasa untuk tetap melayani konten.
Hasil sukses terlihat seperti ini, dan Anda harus membacanya secara teliti, bukan sekadar memindai:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem
This certificate expires on 2026-10-14.
Deploying certificate
Successfully deployed certificate for example.com to /etc/apache2/sites-available/example.com-le-ssl.conf
Successfully deployed certificate for www.example.com to /etc/apache2/sites-available/example.com-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https://example.com and https://www.example.comDi balik pesan tersebut, Certbot melakukan empat hal: mengaktifkan modul ssl Apache jika belum aktif, menulis example.com-le-ssl.conf — salinan vhost Anda di *:443 dengan SSLEngine on dan jalur sertifikat — mengaktifkannya, dan menambahkan blok RewriteRule ke vhost port-80 asli yang melakukan 301 ke HTTPS. File vhost asli Anda diedit, bukan diganti, dan salinan SSL berada di sampingnya sehingga Anda dapat membaca setiap baris yang ditambahkan.
Lokasi sertifikat dan alasan mengapa Anda tidak boleh menyalinnya
Semua file berada di bawah /etc/letsencrypt/live/example.com/: fullchain.pem (sertifikat beserta rantai perantara — yang harus diarahkan oleh server), privkey.pem (kunci privat, hanya dapat dibaca oleh root), serta cert.pem dan chain.pem untuk perangkat lunak yang membutuhkan komponen secara terpisah. File-file ini adalah symlink ke /etc/letsencrypt/archive/, dan metode tidak langsung ini merupakan mekanisme pembaruan: proses pembaruan menulis file baru ke archive/ dan mengarahkan ulang symlink tersebut. Arahkan perangkat lunak lain ke jalur live/ agar pembaruan dapat diterapkan secara otomatis; menyalin file ke lokasi lain akan menyebabkan kegagalan layanan dalam 90 hari.
File lain yang penting untuk diketahui adalah /etc/letsencrypt/renewal/example.com.conf, yang mencatat bagaimana sertifikat ini diterbitkan — authenticator = apache, installer = apache, serta domainnya — sehingga proses pembaruan dapat berjalan secara otomatis, termasuk memuat ulang Apache setelahnya.
Perpanjangan sudah dijadwalkan — verifikasi, jangan buat baru
Sertifikat Let's Encrypt dirancang berlaku selama 90 hari. Paket apt sudah menginstal mekanismenya: sebuah systemd timer yang menjalankan Certbot dua kali sehari pada waktu acak, guna memperbarui sertifikat apa pun dalam rentang 30 hari sebelum kedaluwarsa. Jangan menambahkan cron job tambahan; penjadwal kedua hanya akan menambah kebisingan log dan risiko terkena rate-limit.
systemctl list-timers certbot.timer
sudo certbot renew --dry-runPerintah pertama menunjukkan timer sedang aktif, dengan waktu NEXT dalam 24 jam ke depan — jadwalnya adalah dua kali sehari dengan penundaan acak, sehingga waktu pastinya sengaja dibuat tidak terprediksi (pada instalasi snap, timernya adalah snap.certbot.renew.timer). Perintah dry run melakukan simulasi perpanjangan penuh terhadap lingkungan staging Let's Encrypt — tantangan nyata, tanpa penerbitan sertifikat, tanpa biaya rate-limit. Hasil yang benar diakhiri dengan:
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/example.com/fullchain.pem (success)Jika dry run gagal, perpanjangan asli dalam ~60 hari akan gagal dengan cara yang sama — perbaiki sekarang, selagi sertifikat saat ini masih memiliki masa berlaku penuh. Penyebab umum adalah aturan firewall yang ditambahkan setelah penerbitan yang menutup kembali port 80.
Verifikasi dengan curl, dan tampilan ikon gembok yang seharusnya
curl -sI http://example.com | head -n 3
curl -I https://example.com
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -issuer -datesHasil pertama harus mengembalikan HTTP/1.1 301 Moved Permanently dengan header Location: https://example.com/ — ini adalah pengalihan (redirect) yang diinstal oleh Certbot. Hasil kedua harus mengembalikan HTTP/1.1 200 OK tanpa keluhan TLS dari curl. Hasil ketiga menampilkan penerbit — baris O = Let's Encrypt dengan CN pendek seperti R12 atau E7 — dan notAfter sekitar 90 hari ke depan. Pada peramban, Anda akan melihat ikon gembok, dan mengekliknya akan menampilkan penerbit yang sama. Jika curl berhasil tetapi peramban memberikan peringatan, Anda hampir pasti sedang melihat halaman cache atau hostname yang salah, bukan masalah sertifikat.
Beberapa situs: satu sertifikat SAN atau satu sertifikat per situs
Keduanya dapat digunakan; cara pembaruannya sama. Untuk situs yang tidak saling terkait pada mesin yang sama, jalankan perintah issue satu kali untuk setiap situs — masing-masing akan memiliki direktori sendiri di bawah live/ dan konfigurasi pembaruan sendiri. Masalah pada satu domain tidak akan menghalangi pembaruan domain lainnya. Ini adalah metode default saya.
Untuk satu situs dengan beberapa nama, gunakan satu sertifikat SAN — satu sertifikat dapat menampung hingga 100 nama. Anda telah melakukan ini sebelumnya dengan example.com dan www.example.com. Untuk menambahkan nama ke sertifikat yang sudah ada di kemudian hari, lakukan reissue dengan menyebutkan nama sertifikat dan daftar baru secara lengkap:
sudo certbot --apache --cert-name example.com -d example.com -d www.example.com -d blog.example.comCertbot akan mendeteksi perubahan set domain, meminta konfirmasi ekspansi, dan mengganti sertifikat tersebut di lokasi yang sama — menggunakan path live/ yang sama, sehingga tidak ada hal lain yang perlu diubah. Perlu dicatat bahwa daftar tersebut bersifat mengganti, bukan menambah: jika Anda menghilangkan www dari perintah tersebut, sertifikat baru akan menghapus domain tersebut secara otomatis.
Wildcard memerlukan DNS-01, dan biasanya Anda tidak membutuhkannya
HTTP-01 tidak dapat menerbitkan *.example.com — menempatkan file pada web server hanya membuktikan kontrol atas satu hostname, bukan seluruh namespace. Wildcard memerlukan tantangan DNS-01: Certbot mengatur rekaman TXT pada _acme-challenge.example.com, yang dalam praktiknya berarti memerlukan plugin certbot-dns-* dengan kredensial API untuk penyedia DNS Anda, atau mengedit rekaman TXT secara manual pada setiap pembaruan menggunakan --manual (sangat merepotkan — jangan jadikan ini rencana Anda). Panduan lengkap, mulai dari mekanisme rekaman TXT hingga plugin yang melakukan pembaruan secara otomatis, tersedia di sertifikat wildcard dengan Certbot melalui DNS-01. Saran jujur: jika Anda memiliki empat subdomain yang sudah diketahui, sertifikat SAN yang mencantumkan keempatnya lebih sederhana daripada wildcard dan tidak memerlukan kunci API DNS yang tersimpan di server.
Mode kegagalan, dengan string yang akan Anda lihat
Certbot menolak untuk berjalan karena konfigurasi Apache rusak.
The apache plugin is not working; there may be problems with your existing configuration.
The error was: MisconfigurationError('Error while running apache2ctl configtest.\n\nAction \'configtest\' failed.\nThe Apache error log may have more information.\n\nAH00526: Syntax error on line 12 of /etc/apache2/sites-enabled/example.com.conf')Plugin ini menjalankan configtest sebelum melakukan perubahan apa pun dan berhenti jika Apache mengalami masalah — \n adalah teks literal karena Certbot mencetak repr dari pengecualian tersebut. Jalankan sudo apache2ctl configtest sendiri: perintah ini menyebutkan file dan barisnya — biasanya berupa kesalahan ketik akibat pengeditan manual, SSLCertificateFile yang mengarah ke jalur yang sudah tidak ada, atau modul yang dirujuk tetapi tidak diaktifkan. Perbaiki hingga muncul Syntax OK, lalu jalankan ulang Certbot.
Tidak ada vhost yang cocok dengan domain.
Unable to find a virtual host listening on port 80 which is currently the only challenge port.Ini adalah kegagalan missing-ServerName dari tahap sebelumnya, yang terdeteksi saat proses penerbitan. Certbot mencari setiap vhost port-80 yang aktif untuk ServerName/ServerAlias yang cocok dengan -d Anda dan tidak menemukan apa pun. sudo apache2ctl -S menunjukkan apa yang sebenarnya diarahkan oleh Apache; tambahkan baris ServerName ke vhost yang tepat, muat ulang, lalu coba lagi. Masalah serupa adalah validasi mencapai vhost yang salah — respons tantangan kembali sebagai Invalid response ... 404 karena situs lain menangkap permintaan tersebut. Diagnosis dan alatnya sama: apache2ctl -S.
Validasi mengalami timeout.
Certbot failed to authenticate some domains (authenticator: apache).
...
Detail: ...: Timeout during connect (likely firewall problem)Let's Encrypt tidak dapat membuka koneksi TCP ke port 80 pada alamat yang diiklankan oleh DNS Anda. Berdasarkan tingkat kemungkinan: firewall jaringan penyedia layanan Anda (terpisah dari ufw, dikonfigurasi di panel hosting), aturan ufw yang hanya mengizinkan 443 atau hanya SSH, DNS masih mengarah ke server sebelumnya, atau masalah stale-AAAA — server mereka mencoba IPv6, sedangkan server Anda hanya merespons pada IPv4. Uji dari luar VPS: curl -I http://example.com dari laptop Anda akan mereproduksi apa yang dilihat oleh validator mereka.
Anda terkena limitasi (rate limit) karena terlalu banyak mencoba ulang.
Error creating new order :: too many failed authorizations recently: see https://letsencrypt.org/docs/rate-limits/Let's Encrypt mengizinkan 5 kegagalan validasi per hostname per akun per jam — sejak pembaruan limitasi tahun 2025, sistem ini menggunakan metode refilling bucket, di mana kuota pulih sekitar satu kali coba ulang setiap 12 menit — melakukan percobaan ulang terus-menerus terhadap firewall yang rusak akan menghabiskan kuota dengan cepat. Menunggu adalah solusi, tetapi perbaikan yang sebenarnya adalah perubahan perilaku: setelah kegagalan apa pun, lakukan debug dengan lingkungan staging hingga berhasil.
sudo certbot certonly --apache --dry-run -d example.com -d www.example.comPerhatikan certonly: --dry-run hanya diterima oleh subcommand certonly dan renew, sedangkan bentuk certbot --apache --dry-run akan menolak untuk berjalan dan memberi tahu Anda --dry-run currently only works with the 'certonly' or 'renew' subcommands. Dry run melakukan validasi terhadap staging, yang memiliki limitasi sendiri yang longgar dan tidak menerbitkan sertifikat asli, sehingga Anda dapat melakukan percobaan berkali-kali di sana. Hanya jalankan perintah asli setelah staging berhasil. Limitasi lainnya — 50 sertifikat per domain terdaftar per minggu, 5 duplikat untuk set nama yang sama per minggu — hanya akan Anda temui jika sebuah skrip melakukan penerbitan ulang dalam sebuah loop.
Setelah HTTPS aktif, ingatlah bahwa sertifikat mengamankan transport, bukan server: port 22 masih menerima upaya tebakan kata sandi sepanjang hari. Memasangkan ini dengan Fail2ban di Ubuntu 24.04 adalah langkah selanjutnya yang tepat.
FAQ
Haruskah saya menginstal Certbot dengan snap atau apt untuk Apache di Ubuntu 24.04?
Gunakan apt. Ubuntu 24.04 menyertakan Certbot 2.9.0, yang sudah cukup mutakhir untuk semua panduan ini, mendapatkan patch keamanan melalui unattended-upgrades, dan tidak memerlukan snapd. Pilih snap hanya jika Anda membutuhkan rilis terbaru segera atau plugin DNS yang hanya didistribusikan sebagai snap — dan jika Anda berpindah, lakukan apt remove certbot python3-certbot-apache terlebih dahulu agar dua penjadwal pembaruan tidak berjalan bersamaan.
Mengapa Certbot mengatakan "Unable to find a virtual host listening on port 80"?
Karena tidak ada vhost port-80 yang aktif yang memiliki ServerName atau ServerAlias yang cocok dengan domain yang Anda masukkan dengan -d — vhost bawaan Ubuntu menyertakan ServerName dalam keadaan dikomentari. Jalankan sudo apache2ctl -S, cari (atau buat) vhost yang seharusnya memiliki nama tersebut, tambahkan ServerName example.com, muat ulang Apache, dan jalankan kembali Certbot.
Bagaimana cara memperbaiki "Timeout during connect (likely firewall problem)"?
Let's Encrypt tidak dapat menjangkau port 80 pada alamat yang dipublikasikan oleh DNS Anda. Periksa firewall jaringan pada level panel penyedia Anda serta ufw, pastikan dig +short example.com mengarah ke VPS ini, dan hapus atau perbaiki rekaman AAAA yang sudah tidak valid — validasi lebih mengutamakan IPv6 jika tersedia. Konfirmasikan perbaikan dari luar server dengan curl -I http://example.com, lalu lakukan uji coba dengan sudo certbot certonly --apache --dry-run -d example.com sebelum penerbitan asli.
Apakah Certbot memperbarui sertifikat secara otomatis di Ubuntu 24.04?
Ya. Paket apt menginstal certbot.timer, sebuah systemd timer yang berjalan dua kali sehari dan memperbarui sertifikat apa pun dalam waktu 30 hari sebelum kedaluwarsa, lalu memuat ulang Apache; versi snap menggunakan snap.certbot.renew.timer untuk tugas yang sama. Verifikasi dengan systemctl list-timers certbot.timer dan lakukan uji coba dengan sudo certbot renew --dry-run — jangan menambahkan cron job Anda sendiri di atasnya.
Bagaimana cara mendapatkan sertifikat wildcard dengan Certbot dan Apache?
Wildcard memerlukan tantangan DNS-01: Certbot harus menempatkan rekaman TXT di _acme-challenge.example.com, yang berarti memerlukan plugin certbot-dns-* dengan kredensial API untuk penyedia DNS Anda (alternatif --manual memerlukan pengeditan manual rekaman TXT pada setiap pembaruan). Jika Anda hanya memiliki sedikit subdomain yang sudah diketahui, sertifikat SAN yang mencantumkan subdomain tersebut secara eksplisit lebih sederhana dan menjaga kunci API DNS tetap aman dari server.