Apakah ini cara yang benar untuk menetapkan cron untuk pembaruan sertifikat Let's Encrypt di Apache2? Saya menggunakan Ubuntu 16.04.
@monthly letsencrypt renew && service apache2 reload
Apakah ini cara yang benar untuk menetapkan cron untuk pembaruan sertifikat Let's Encrypt di Apache2? Saya menggunakan Ubuntu 16.04.
@monthly letsencrypt renew && service apache2 reload
Jawaban:
Bulanan tidak cukup sering. Script ini harus dijalankan setidaknya setiap minggu, dan lebih disukai setiap hari. Ingatlah bahwa sertifikat tidak dapat diperpanjang kecuali mereka hampir kedaluwarsa, dan setiap bulan akan menyebabkan sertifikat Anda yang sudah ada terkadang kadaluwarsa sebelum diperbarui.
Nama programnya adalah certbot
, yang diubah namanya dari letsencrypt
. Jika Anda masih menggunakan letsencrypt
, Anda perlu memperbarui ke versi saat ini.
Selain masalah-masalah itu, ini hampir sama dengan pekerjaan cron saya.
43 6 * * * certbot renew --post-hook "systemctl reload nginx"
Perhatikan bahwa pada 18,04 LTS paket letsencrypt telah (akhirnya) diganti namanya menjadi certbot. Sekarang termasuk timer systemd yang dapat Anda aktifkan untuk menjadwalkan pembaruan certbot, dengan systemctl enable certbot.timer
dan systemctl start certbot.timer
. Namun, Ubuntu tidak menyediakan cara untuk menentukan kait. Anda harus mengatur override untuk certbot.service
menimpa ExecStart=
dengan baris perintah yang Anda inginkan, sampai Ubuntu memperbaikinya.
--renew-hook
daripada --post-hook
hanya restart jika sertifikat berhasil diperbarui.
certbot renew
hanya akan berfungsi ™
ExecStartPost=/usr/sbin/service nginx reload
. Bekerja untukku!
ExecStartPost=
adalah ide yang bagus. Kenapa aku tidak memikirkan itu? Namun ketahuilah bahwa service
perintah sudah usang; itu tidak akan ada selamanya. Beralih ke systemctl
perintah yang sesuai .
Saya tidak punya reputasi untuk berkomentar, jadi saya akan jawab di sini. Saya baru-baru ini (Oktober 2017) menginstal dan menjalankan certbot pada server Ubuntu 16.04 dan pekerjaan pembaruan cron dibuat secara otomatis di /etc/cron.d/certbot
.
Inilah pekerjaan cron yang telah dibuat:
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew
Sebaiknya periksa, apakah file ini sudah ada sebelum membuat entri crontab.
certbot renew
jika /run/systemd/system
ada - ini karena alih-alih timer systemd sedang menjalankan certbot - baca lebih lanjut tentang penghitung waktu certbot dan systemd di sini .
43 6 * * *
akan membuatnya berjalan setiap hari pukul 6:43 pagi. Sekali sehari sudah mencukupi, tetapi salah satunya berfungsi dengan baik.
The dokumentasi certbot merekomendasikan menjalankan script dua kali sehari:
catatan:
jika Anda menyiapkan pekerjaan cron atau systemd, kami sarankan menjalankannya dua kali per hari (itu tidak akan melakukan apa-apa sampai sertifikat Anda akan diperpanjang atau dicabut, tetapi menjalankannya secara teratur akan memberikan situs Anda kesempatan untuk tetap online di kasus pencabutan yang dimulai oleh Let's Encrypt terjadi karena beberapa alasan). Silakan pilih satu menit acak dalam satu jam untuk tugas perpanjangan Anda.
Seperti Michael Hampton menyebutkan nama telah berubah menjadi certbot, tetapi mereka masih menyediakan opsi -auto yang terus diperbarui. The certbot-auto
perintah perlu hak istimewa root untuk menjalankan, sehingga garis dalam naskah cron Anda harus terlihat seperti ini:
52 0,12 * * * root /full/path/to/certbot-auto renew --quiet
Dalam kasus saya sendiri, certbot-auto
skrip ditempatkan di direktori home git-user. Perintah tepatnya adalah
52 0,12 * * * root /home/git/certbot-auto renew --quiet
Perhatikan bahwa contoh dalam dokumentasi sesuai dengan jalur relatif, seperti yang ditunjukkan oleh titik yang dapat membingungkan:
./path/to/certbot-auto renew --quiet
Pastikan untuk menguji kembali perintah perpanjangan dalam shell sebelumnya untuk menguji jalan, jika sertifikat tidak jatuh tempo untuk pembaruan tidak akan terjadi apa-apa (jalankan tes ini tanpa --quiet
tanda untuk melihat apa yang terjadi).
Tidak perlu memuat ulang server saat sertifikat diperbarui dengan cara ini, karena jalur ke sertifikat langsung tidak berubah jika disiapkan dengan benar.
Ini benar jika Anda menjalankan apache - untuk nginx, pertimbangkan untuk menambahkan kait perpanjangan, seperti:
52 0,12 * * * root certbot renew --renew-hook 'service nginx reload'
--renew-hook
untuk memulai kembali setelah pembaruan yang berhasil: guyrutenberg.com/2017/01/01/…
Anda tidak harus mengatur apa pun. Instalasi Certbot Debian / Ubuntu baru-baru ini harus menginstal timer systemd dan pekerjaan cron (dan pekerjaan cron hanya akan berjalan certbot
jika systemd tidak aktif, sehingga Anda tidak dapat menjalankan keduanya).
Anda dapat memeriksa timer sistemd Anda menggunakan perintah systemctl list-timers
(atau systemctl list-timers --all
jika Anda juga ingin menunjukkan timer tidak aktif). Sesuatu seperti ini:
% sudo systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
Fri 2018-08-03 06:17:25 UTC 10h left Thu 2018-08-02 06:27:13 UTC 13h ago apt-daily-upgrade.timer apt-daily-upgrade.service
Fri 2018-08-03 11:43:29 UTC 15h left Thu 2018-08-02 16:54:52 UTC 3h 7min ago certbot.timer certbot.service
Fri 2018-08-03 12:44:58 UTC 16h left Thu 2018-08-02 19:14:58 UTC 47min ago apt-daily.timer apt-daily.service
Fri 2018-08-03 19:43:44 UTC 23h left Thu 2018-08-02 19:43:44 UTC 18min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Mon 2018-08-06 00:00:00 UTC 3 days left Mon 2018-07-30 00:00:09 UTC 3 days ago fstrim.timer fstrim.service
Timer certbot harus ada di sini /lib/systemd/system/certbot.timer
dan itu akan menjalankan perintah yang ditentukan dalam/lib/systemd/system/certbot.service
certbot.timer
akan menjalankan `certbot.service pukul 12 pagi dan 12 siang, setelah penundaan acak hingga 12 jam (43200 detik).
# cat /lib/systemd/system/certbot.timer
[Unit]
Description=Run certbot twice daily
[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true
[Install]
WantedBy=timers.target
dan certbot.service
akan menjalankan perintah perpanjangan.
# cat /lib/systemd/system/certbot.service
[Unit]
Description=Certbot
Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html
Documentation=https://letsencrypt.readthedocs.io/en/latest/
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot -q renew
PrivateTmp=true
Seperti yang disebutkan orang lain, ada juga cron job yang diinstal di /etc/cron.d/certbot
:
# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc. Renewal will only occur if expiration
# is within 30 days.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
Ini dilakukan:
test -x /usr/bin/certbot -a \! -d /run/systemd/system
- memeriksa apakah /usr/bin/certbot
adalah file executable dan bahwa /run/systemd/system
adalah tidak sebuah direktori. Hanya melanjutkan ke bit berikutnya jika pemeriksaan ini berhasil.
perl -e 'sleep int(rand(43200))'
- tidur dalam jumlah acak antara 0 detik dan 12 jam (43200 = 12 x 60 x 60).certbot -q renew
periksa sertifikat Anda dan perbarui jika diperlukan. The -q
bendera "tenang" - tidak menghasilkan output apapun kecuali ada kesalahan.Saya awalnya bingung dengan pekerjaan cron karena tidak akan berjalan karena systemd, jadi bagaimana certbot dijalankan? Saya menemukan jawaban di posting forum ini yang menjadi dasar jawaban ini.
/etc/cron.d/certbot
ada, systemctl list-timers
pertunjukan certbot.timer
, tetapi sertifikat saya tidak diperpanjang. Menjalankan certbot
secara manual bekerja dengan baik, jadi saya tidak tahu apa yang terjadi. Akhirnya menambahkan crontab
entri sekolah lama .
test
untuk memeriksa apakah systemd aktif dan jika itu, pekerjaan cron segera keluar tanpa berjalan certbot
- lihat teks tentang pekerjaan cron. Saya akan mengedit teks untuk lebih tepatnya.
Untuk perpanjangan sertifikat LetsEncrypt, saya biasanya menggunakan getsl . Ini adalah pembungkus shell yang sangat berguna yang bahkan dapat menginstal sertifikat pada mesin lain melalui koneksi SSH.
Entri cron adalah sebagai berikut:
01 23 * * * root /root/scripts/getssl/getssl -u -a -q >>/var/log/getssl.log 2>&1 ; /usr/sbin/apache2ctl graceful
Seperti yang sudah disarankan, Anda harus menjalankannya setiap hari atau, bahkan lebih baik, dua kali sehari.
Seperti yang telah disebutkan oleh glaux:
Catatan: jika Anda menyiapkan pekerjaan cron atau systemd, kami sarankan menjalankannya dua kali per hari (itu tidak akan melakukan apa-apa sampai sertifikat Anda dijadwalkan untuk diperpanjang atau dicabut, tetapi menjalankannya secara teratur akan memberikan situs Anda kesempatan untuk tetap di situs Anda. online jika pencabutan yang dimulai oleh Let's Encrypt terjadi karena beberapa alasan). Silakan pilih satu menit acak dalam satu jam untuk tugas perpanjangan Anda.
Sumber: https://certbot.eff.org/all-instructions/#debian-8-jessie-apache
Jadi saya akhirnya menggunakan ini (berlari adalah dua kali sehari, pukul 01:00 dan pukul 13:00 setiap hari):
6 1,13 * * * certbot renew --post-hook "service apache2 restart"
atau bahkan lebih baik:
6 1,13 * * * certbot renew --renew-hook "service apache2 restart"
Saya tidak menguji tetapi ini juga harus berfungsi:
6 1,13 * * * certbot renew --post-hook "/etc/init.d/apache2 restart"
6 1,13 * * * certbot renew --renew-hook "/etc/init.d/apache2 restart"
--pre-hook dan --post-hooks dijalankan sebelum dan sesudah setiap upaya pembaruan. Jika Anda ingin kait Anda berjalan hanya setelah pembaruan berhasil, gunakan --renew-hook dalam perintah seperti ini.
--renew-hook
, yang me-restart server Anda hanya ketika sertifikat tersebut benar-benar diperbarui.
--post-hook
dan --renew-hook
menjadi service apache2 restart
bukan service restart apache2
?
service restart apache2
bukan perintah yang benar / layanan.
Inilah yang saya gunakan:
/opt/letsencrypt/letsencrypt-auto renew
memberikan output sebagai:
Upgrading certbot-auto 0.8.1 to 0.9.1...
Replacing certbot-auto...
Creating virtual environment...
...
new certificate deployed with reload of apache server; fullchain is
/etc/letsencrypt/live/host.simplecoin.cz/fullchain.pem
-------------------------------------------------------------------------------
Congratulations, all renewals succeeded. The following certs have been renewed:
/etc/letsencrypt/live/host.simplecoin.cz/fullchain.pem (success)
Dan mengatakan bahwa apache sudah dimulai kembali, jadi tidak perlu melakukannya lagi. Jika saya jalankan lagi:
Cert not yet due for renewal
oleh karena itu tidak masalah untuk memperbarui sertifikat setiap hari, cron saya adalah:
@daily /opt/letsencrypt/cronautorenew.sh
Saya menggunakan skrip untuk men-tweak logging untuk memisahkan file, jadi di sini adalah cronautorenew.sh saya:
#!/usr/bin/env bash
printf "\nattempt to renew certificates" >>/var/log/letsencrypt_cron.log 2>&1
date >>/var/log/letsencrypt_cron.log 2>&1
/opt/letsencrypt/letsencrypt-auto renew >>/var/log/letsencrypt_cron.log 2>&1
printf "renew finished\n" >>/var/log/letsencrypt_cron.log 2>&1
Anggota lain sudah memberikan jawaban yang lebih detail. Tapi sepertinya aku harus menyebutkannya di sini.
Pada certbot versi 0.21.1 --renew-hook
flag diubah menjadi --deploy-hook
Pastikan Anda tidak menggunakan flag yang sudah usang.
certbot renew --deploy-hook "systemctl restart myservice"
Menurut panduan certbot EFF
Banyak distribusi Linux menyediakan pembaruan otomatis ketika Anda menggunakan paket yang diinstal melalui manajer paket sistem mereka.
Jika Anda tidak yakin apakah sistem Anda sudah otomatis atau belum, periksa crontab sistem Anda (biasanya di /etc/crontab/
dan /etc/cron.*/*
$ crontab -l
dan timer systemd $ systemctl list-timers
.
/etc/cron.d/certbot