Install Certbot Apache di Ubuntu 24.04
Pasang sertifikat Let's Encrypt untuk Apache dengan satu perintah. Ubuntu 24.04 menyertakan Certbot 2.9.0 melalui apt, plus jebakan ServerName yang dapat menggagalkan penerbitan.
Yang Anda bangun
Situs Apache pada Ubuntu 24.04 yang merespons melalui HTTPS dengan sertifikat Let's Encrypt gratis dan dipercaya browser. Sertifikat ini diterbitkan oleh Certbot dan diperbarui otomatis oleh timer systemd, sehingga Anda tidak perlu memikirkannya lagi. Perintah yang melakukan semuanya hanya satu baris. Semua masalah terjadi sebelum baris tersebut dijalankan: vhost tanpa ServerName, port 80 yang ditutup pada firewall penyedia, atau DNS yang masih mengarah ke server lama. Karena itu, panduan ini sebagian besar membahas prasyarat dan mencantumkan string error yang tepat untuk setiap kesalahan.
Ada dua catatan tentang cakupan. Jika web server Anda adalah nginx, alurnya memiliki bentuk yang sama, tetapi plugin dan konfigurasinya berbeda. Gunakan versi panduan ini untuk nginx. Jika layanan yang Anda amankan hanya digunakan secara internal, misalnya panel admin pada alamat privat atau server staging yang tidak diakses pihak lain, Anda tidak memerlukan certificate authority. Sertifikat yang ditandatangani sendiri memerlukan lebih sedikit komponen dan dapat digunakan secara offline.
Prasyarat, dan tiga penyebab kegagalan sebelum Certbot dijalankan
- Apache sudah menyajikan situs Anda melalui HTTP biasa. Plugin Apache Certbot mengubah situs yang sudah ada; plugin ini tidak membuat situs baru. Jika Anda memulai dari VPS kosong, siapkan stack LAMP di Ubuntu 24.04 terlebih dahulu, lalu kembali ke sini. Panduan ini adalah bab TLS yang belum tersedia di dalamnya.
- Domain publik dengan record A yang mengarah ke alamat VPS Anda. Challenge HTTP-01 dari Let's Encrypt mengharuskan server validasi mereka terhubung ke server Anda melalui Internet: homelab yang berada di balik NAT tidak dapat digunakan tanpa port forwarding, begitu juga nama
.localdan alamat IP tanpa domain.dig +short example.comharus mengembalikan alamat VPS Anda. Jika Anda mengubah DNS dalam satu jam terakhir, tunggu hingga TTL record lama berakhir sebelum menerbitkan sertifikat. - Jika terdapat record AAAA, record tersebut harus benar. Let's Encrypt lebih memilih IPv6 ketika record AAAA dipublikasikan. Karena itu, AAAA yang sudah kedaluwarsa dapat menyebabkan validasi gagal, meskipun
curldari laptop Anda, yang kemungkinan menggunakan IPv4, berfungsi dengan baik. Publikasikan AAAA yang benar atau jangan publikasikan record tersebut sama sekali.
Port 80 dan 443 harus terbuka di ufw dan firewall jaringan penyedia Anda. Sebagian besar panel hosting memiliki firewall kedua yang tidak terlihat oleh sistem operasi. HTTP-01 secara khusus melakukan validasi melalui port 80; Anda tidak dapat menjalankan proses ini hanya dengan port 443.
sudo ufw allow "Apache Full"
sudo ufw statusSetelah semua prasyarat terpenuhi, seluruh proses ini hanya memerlukan lima belas menit, dan sepuluh menit di antaranya digunakan untuk membaca.
Certbot snap atau apt? Pada 24.04, apt akhirnya sudah tepat
Certbot beralih ke distribusi snap beberapa tahun lalu karena alasan yang jelas: paket distribusi tidak lagi diperbarui. Ubuntu 20.04 menyertakan Certbot 0.40 dan tidak pernah memperbaruinya, sementara proyek tersebut tidak ingin terus men-debug bug yang sudah berusia lima tahun. Pada 24.04, alasan itu sudah tidak berlaku. Arsipnya menyediakan Certbot 2.9.0, rilis generasi saat ini, dan unattended-upgrades terus menerapkan patch untuknya. Rekomendasi saya untuk OS ini: gunakan apt. Anda tidak perlu menjalankan daemon snapd, plugin Apache terpasang dalam transaksi yang sama, dan timer pembaruan terintegrasi dengan systemd menggunakan cara Debian yang 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 mengubah konfigurasi Apache Anda. Tanpa paket tersebut, certbot --apache gagal dengan The requested apache plugin does not appear to be installed.
Snap tetap merupakan pilihan yang tepat dalam 2 kasus: Anda menginginkan Certbot terbaru pada hari rilisnya, atau memerlukan plugin DNS yang hanya didistribusikan sebagai snap (beberapa plugin penyedia certbot-dns-* termasuk di dalamnya). Jika 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 pilihan Anda, jangan pernah menjalankan keduanya. Dua instalasi berarti 2 penjadwal pembaruan yang saling berebut /etc/letsencrypt, dan certbot yang ditemukan shell Anda di PATH mungkin bukan instalasi yang memiliki sertifikat Anda. Baris apt remove di atas bukan sekadar hiasan dan wajib digunakan.
Vhost yang diedit Certbot harus sudah ada, ServerName adalah faktor penentu
certbot --apache bekerja dengan mencari virtual host pada port 80 yang ServerName atau ServerAlias-nya cocok dengan setiap domain -d yang Anda berikan. Setelah membuktikan kendali atas domain tersebut, certbot --apache menulis pasangan SSL dari vhost itu. Jika tidak ada ServerName yang cocok, tidak ada kecocokan. Pada Ubuntu, 000-default.conf bawaan dikirim dengan ServerName dalam keadaan dikomentari. Satu baris yang dikomentari ini adalah penyebab paling umum kegagalan perintah besar dalam panduan ini.
Jadi, sebelum menjalankan 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 vhost tersebut dan pastikan Apache dapat mem-parsing konfigurasinya serta mengarahkan nama tersebut ke vhost itu:
sudo a2ensite example.com.conf
sudo apache2ctl configtest
sudo systemctl reload apache2
sudo apache2ctl -Sconfigtest harus mencetak Syntax OK. Jika juga mencetak AH00558: apache2: Could not reliably determine the server's fully qualified domain name, itu adalah peringatan tentang ServerName global, bukan vhost Anda. Peringatan tersebut tidak berbahaya dalam kasus ini dan dapat dibungkam 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 ingin melihat 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 benar-benar dibacanya, bukan file yang Anda edit di sites-available. Jika example.com tidak tercantum pada port 80, Certbot juga tidak akan menemukannya.
Terbitkan sertifikat: certbot --apache
sudo certbot --apache -d example.com -d www.example.comPada proses pertama, Anda diminta memberikan tiga hal: alamat email (digunakan untuk akun ACME dan pemberitahuan penting dari CA; Let's Encrypt tidak lagi mengirim peringatan masa berlaku, jadi Anda harus memantau perpanjangan sendiri), persetujuan terhadap ketentuan Let's Encrypt, dan pilihan untuk membagikan email Anda kepada EFF. Pertanyaan tentang redirect tidak lagi ditampilkan: sejak Certbot 2.0, installer Apache secara default mengalihkan HTTP ke HTTPS, dan itulah konfigurasi yang Anda perlukan. Gunakan --no-redirect jika Anda memang perlu agar HTTP biasa tetap menyajikan konten.
Tanda keberhasilan terlihat seperti berikut. Baca output ini dengan saksama, jangan hanya memindainya:
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 Apache ssl jika belum aktif, menulis example.com-le-ssl.conf sebagai salinan vhost Anda pada *:443 yang berisi SSLEngine on dan path sertifikat, mengaktifkan vhost tersebut, serta menambahkan blok RewriteRule ke vhost port-80 asli untuk mengalihkan semua permintaan ke HTTPS dengan kode 301. File vhost asli Anda diedit, bukan diganti, dan salinan SSL berada di sebelahnya sehingga Anda dapat membaca setiap baris yang ditambahkan.
Lokasi sertifikat sebenarnya, dan alasan Anda tidak pernah menyalinnya
Semua file berada di bawah /etc/letsencrypt/live/example.com/: fullchain.pem (sertifikat beserta rantai perantara, yang harus dituju oleh server), privkey.pem (kunci privat, hanya dapat dibaca oleh root), serta cert.pem dan chain.pem untuk perangkat lunak yang memerlukan komponen tersebut secara terpisah. File-file ini adalah symlink ke dalam /etc/letsencrypt/archive/. Indireksi tersebut merupakan mekanisme perpanjangan: proses perpanjangan menulis file baru ke dalam archive/ lalu mengarahkan ulang symlink. Arahkan perangkat lunak lain ke path live/ agar perangkat lunak tersebut otomatis menggunakan hasil perpanjangan. Jika Anda menyalin file ke lokasi lain, layanan Anda akan gagal setelah 90 hari.
File lain yang perlu diketahui adalah /etc/letsencrypt/renewal/example.com.conf. File ini mencatat cara sertifikat diterbitkan, authenticator = apache, installer = apache, serta domain yang digunakan. Dengan demikian, proses perpanjangan dapat mengulangi proses tersebut tanpa intervensi, termasuk memuat ulang Apache setelahnya.
Perpanjangan sudah dijadwalkan, verifikasi dan jangan membuat penjadwal baru
Sertifikat Let’s Encrypt berlaku selama 90 hari secara desain, dan paket apt sudah memasang mekanismenya: timer systemd yang menjalankan Certbot dua kali sehari pada waktu yang diacak, serta memperbarui sertifikat apa pun yang masa berlakunya tersisa kurang dari 30 hari. Jangan menambahkan cron job; penjadwal kedua hanya menambah kebisingan pada log dan paparan terhadap pembatasan laju.
systemctl list-timers certbot.timer
sudo certbot renew --dry-runPerintah pertama menampilkan timer yang aktif, dengan waktu NEXT dalam 24 jam berikutnya. Jadwalnya berjalan dua kali sehari dengan penundaan acak, sehingga waktu tepatnya memang sengaja tidak dapat diprediksi. Pada instalasi snap, timer tersebut adalah snap.certbot.renew.timer. Dry run menjalankan simulasi lengkap perpanjangan terhadap lingkungan staging Let's Encrypt, menggunakan challenge nyata tanpa menerbitkan sertifikat dan tanpa mengonsumsi batas laju. Hasil yang benar diakhiri dengan:
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/example.com/fullchain.pem (success)Jika dry run gagal, perpanjangan sebenarnya dalam ~60 hari akan gagal dengan cara yang sama. Perbaiki sekarang, saat sertifikat yang sedang digunakan masih memiliki seluruh masa berlakunya. Penyebab yang umum adalah aturan firewall yang ditambahkan setelah penerbitan sertifikat dan kembali menutup port 80.
Verifikasi dengan curl dan informasi pada ikon gembok
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 -datesPerintah pertama seharusnya mengembalikan HTTP/1.1 301 Moved Permanently dengan header Location: https://example.com/. Header tersebut berasal dari pengalihan yang dipasang Certbot. Perintah kedua seharusnya mengembalikan HTTP/1.1 200 OK tanpa keluhan TLS dari curl. Perintah ketiga menampilkan penerbit, baris O = Let's Encrypt dengan CN singkat seperti R12 atau E7, serta notAfter yang masa berlakunya kira-kira 90 hari lagi. Di browser, ikon gembok akan muncul. Jika diklik, ikon tersebut menampilkan penerbit yang sama. Jika curl berhasil tetapi browser menampilkan peringatan, hampir pasti Anda sedang melihat halaman yang tersimpan dalam cache atau hostname yang salah, bukan mengalami masalah sertifikat.
Situs ganda: satu sertifikat SAN atau satu sertifikat per situs
Keduanya dapat digunakan dan diperbarui dengan cara yang sama. Untuk situs yang tidak saling terkait pada server yang sama, jalankan perintah issue sekali untuk setiap situs. Masing-masing situs mendapatkan direktorinya sendiri di bawah live/ dan konfigurasi pembaruannya sendiri. Masalah pada satu domain tidak akan pernah menghambat pembaruan domain lain. Ini adalah pilihan default saya.
Untuk satu situs dengan beberapa nama, gunakan satu sertifikat SAN. Satu sertifikat dapat memuat hingga 100 nama. Anda sudah melakukannya di atas dengan example.com dan www.example.com. Untuk menambahkan nama ke sertifikat yang sudah ada, terbitkan ulang sertifikat tersebut dengan menyebutkan nama sertifikat dan daftar baru yang lengkap:
sudo certbot --apache --cert-name example.com -d example.com -d www.example.com -d blog.example.comCertbot mendeteksi perubahan pada kumpulan domain, meminta konfirmasi untuk memperluasnya, lalu mengganti sertifikat di lokasi yang sama, yaitu path live/. Dengan demikian, tidak ada hal lain yang perlu diubah. Perhatikan bahwa daftar tersebut menggantikan daftar sebelumnya, bukan menambahkan isinya. Jika Anda menghilangkan www dari perintah tersebut, sertifikat baru akan menghapusnya tanpa menampilkan peringatan.
Wildcard memerlukan DNS-01, dan biasanya Anda tidak memerlukan wildcard
HTTP-01 tidak dapat menerbitkan *.example.com. Menempatkan file pada web server membuktikan kendali atas satu hostname, bukan seluruh namespace. Wildcard memerlukan challenge DNS-01. Certbot menetapkan record TXT pada _acme-challenge.example.com. Dalam praktiknya, ini berarti menggunakan plugin certbot-dns-* dengan kredensial API untuk penyedia DNS Anda, atau mengedit record TXT secara manual setiap kali renewal dengan --manual (merepotkan dan tidak layak dijadikan rencana). Panduan lengkap, mulai dari mekanisme record TXT hingga plugin yang melakukan renewal tanpa pengawasan, tersedia dalam sertifikat wildcard dengan Certbot melalui DNS-01. Saran yang realistis: jika Anda memiliki empat subdomain yang sudah diketahui, sertifikat SAN yang mencantumkan keempatnya lebih sederhana daripada wildcard dan tidak memerlukan API key DNS yang tersimpan di server.
Mode kegagalan dan 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 menjalankan configtest sebelum melakukan tindakan apa pun. Proses dihentikan jika Apache sendiri bermasalah. \n bersifat literal karena Certbot mencetak representasi exception. Jalankan sudo apache2ctl configtest secara manual. Perintah ini menampilkan file dan baris yang bermasalah. Penyebabnya biasanya kesalahan ketik akibat pengeditan manual, SSLCertificateFile yang menunjuk ke path yang sudah tidak ada, atau modul yang direferensikan tetapi belum diaktifkan. Perbaiki hingga perintah tersebut mencetak Syntax OK, lalu jalankan kembali 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 karena ServerName yang dibahas sebelumnya, dan terdeteksi saat penerbitan. Certbot mencari semua vhost port 80 yang diaktifkan untuk menemukan ServerName/ServerAlias yang cocok dengan -d, tetapi tidak menemukan apa pun. sudo apache2ctl -S menampilkan rute yang sebenarnya digunakan Apache. Tambahkan baris ServerName ke vhost yang benar, reload Apache, lalu coba lagi. Masalah serupa terjadi jika validasi mencapai vhost yang salah. Respons challenge menjadi Invalid response ... 404 karena situs lain menangani request 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 diumumkan DNS Anda. Urutan penyebab yang paling mungkin adalah firewall jaringan provider Anda, yang terpisah dari ufw dan dikonfigurasi pada panel hosting; ruleset ufw yang hanya mengizinkan 443 atau SSH; DNS yang masih menunjuk ke server sebelumnya; atau masalah AAAA yang sudah usang, ketika server mereka mencoba IPv6 sedangkan server Anda hanya merespons melalui IPv4. Uji dari luar VPS. curl -I http://example.com dari laptop Anda mereproduksi kondisi yang dilihat validator mereka.
Anda mencoba lagi hingga terkena rate limit.
Error creating new order :: too many failed authorizations recently: see https://letsencrypt.org/docs/rate-limits/Let's Encrypt mengizinkan 5 validasi yang gagal untuk setiap hostname per account per jam. Sejak perombakan rate limit pada 2025, batas ini menggunakan bucket yang terisi kembali. Anda memperoleh kembali sekitar satu percobaan setiap 12 menit. Percobaan ulang terus-menerus saat firewall masih rusak akan menghabiskan batas tersebut dengan cepat. Menunggu memang dapat menyelesaikan masalah, tetapi perbaikan yang sebenarnya adalah mengubah cara kerja: setelah kegagalan apa pun, lakukan debugging menggunakan environment 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. Bentuk certbot --apache --dry-run tanpa argumen sama sekali tidak dapat dijalankan dan menampilkan --dry-run currently only works with the 'certonly' or 'renew' subcommands. Dry run melakukan validasi terhadap staging, yang memiliki batasnya sendiri dan lebih longgar serta tidak menerbitkan sertifikat nyata. Dengan demikian, Anda dapat mengalami kegagalan di sana sepanjang hari. Jalankan kembali command nyata hanya setelah staging berhasil. Batas lainnya adalah 50 sertifikat per registered domain per minggu dan 5 duplikat dari set nama yang sama per minggu. Anda hanya akan mencapai batas ini jika sebuah script menerbitkan ulang sertifikat dalam loop.
Setelah HTTPS aktif, ingat bahwa sertifikat mengamankan transport, bukan server. Port 22 tetap menerima tebakan password sepanjang hari. Memasangkan konfigurasi ini dengan Fail2ban pada Ubuntu 24.04 adalah langkah lanjutan yang wajar untuk 30 menit berikutnya.
FAQ
Apakah saya harus menginstal Certbot dengan snap atau apt untuk Apache di Ubuntu 24.04?
Gunakan apt. Ubuntu 24.04 merilis Certbot 2.9.0, yang sudah cukup baru untuk semua langkah dalam panduan ini, menerima patch keamanan melalui unattended-upgrades, dan tidak memerlukan snapd. Pilih snap hanya jika Anda memerlukan rilis terbaru segera atau plugin DNS yang hanya didistribusikan sebagai snap. Jika beralih, apt remove certbot python3-certbot-apache terlebih dahulu agar dua penjadwal pembaruan tidak berjalan bersamaan.
Mengapa Certbot menampilkan pesan "Unable to find a virtual host listening on port 80"?
Karena tidak ada vhost port 80 yang diaktifkan dengan ServerName atau ServerAlias yang cocok dengan domain yang Anda berikan melalui -d. Pada vhost default Ubuntu, ServerName dikomentari. Jalankan sudo apache2ctl -S, temukan atau buat vhost yang harus memiliki nama tersebut, tambahkan ServerName example.com, muat ulang Apache, lalu 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 panel penyedia, serta ufw. Pastikan dig +short example.com mengarah ke VPS ini, lalu hapus atau perbaiki data AAAA yang sudah usang. Validasi akan memprioritaskan IPv6 jika data tersebut ada. 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 sertifikat yang sebenarnya.
Apakah Certbot memperbarui sertifikat secara otomatis pada Ubuntu 24.04?
Ya. Paket apt menginstal certbot.timer, yaitu timer systemd yang berjalan dua kali sehari dan memperbarui setiap sertifikat yang masa berlakunya akan berakhir dalam 30 hari, lalu memuat ulang Apache. snap menggunakan snap.certbot.renew.timer untuk tugas yang sama. Verifikasikan dengan systemctl list-timers certbot.timer dan lakukan uji coba dengan sudo certbot renew --dry-run. Jangan menambahkan cron job sendiri di atas mekanisme tersebut.
Bagaimana cara mendapatkan sertifikat wildcard dengan Certbot dan Apache?
Sertifikat wildcard memerlukan challenge DNS-01. Certbot harus menambahkan data TXT pada _acme-challenge.example.com. Artinya, Anda memerlukan plugin certbot-dns-* dengan kredensial API untuk penyedia DNS Anda. Alternatif --manual memerlukan pengeditan manual data TXT setiap kali pembaruan. Jika Anda hanya memiliki beberapa subdomain yang sudah diketahui, sertifikat SAN yang mencantumkannya secara eksplisit lebih sederhana dan mencegah kunci API DNS tersimpan di server.