Pekerjaan Cron untuk mengenkripsi pembaruan

93

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
pengguna3448600
sumber
6
Seperti yang dinyatakan salah satu jawaban di bawah ini, certbot v0.19.0 (dan mungkin beberapa yang sebelumnya) sudah membuat entri crontab @/etc/cron.d/certbot
xgMz
Juga, plugin apache certbot dengan validasi tls-sni akan memuat ulang apache sebagai bagian dari prosedur validasi setelah sertifikat baru telah diambil.
xgMz
Ada jawaban di bawah ini yang sangat penting untuk pemasangan baru (mulai JAN 2019), certbot secara otomatis menambahkan timer sistem dan jadwal tugas cron sehingga pengaturan cron tidak diperlukan di pihak Anda.
Cory Robinson

Jawaban:

145

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.timerdan systemctl start certbot.timer. Namun, Ubuntu tidak menyediakan cara untuk menentukan kait. Anda harus mengatur override untuk certbot.servicemenimpa ExecStart=dengan baris perintah yang Anda inginkan, sampai Ubuntu memperbaikinya.

Michael Hampton
sumber
3
Jendela waktu apa yang "hampir kedaluwarsa"?
Andre Figueiredo
3
Mungkin lebih baik bagi pengguna --renew-hookdaripada --post-hookhanya restart jika sertifikat berhasil diperbarui.
mwfearnley
6
Untuk apache / httpd, certbot renewhanya akan berfungsi ™
aairey
1
Saya hanya ingin menambahkan, daripada override ExecStart untuk reload nginx, hanya menambahkan baris ExecStartPost untuk certbot.service untuk reload server web Anda setelah itu dilakukan: ExecStartPost=/usr/sbin/service nginx reload. Bekerja untukku!
JD Mallen
1
@ JDMallen Menggunakan ExecStartPost=adalah ide yang bagus. Kenapa aku tidak memikirkan itu? Namun ketahuilah bahwa serviceperintah sudah usang; itu tidak akan ada selamanya. Beralih ke systemctlperintah yang sesuai .
Michael Hampton
56

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.

ishigoya
sumber
1
Saya melihat ini juga setelah menjalankan certbot. Sangat bagus yang memungkinkan enkripsi melakukan ini! Ini proyek yang bagus.
Bjorn
7
Perlu diketahui bahwa tugas cron di atas tidak akan berjalan certbot renewjika /run/systemd/systemada - ini karena alih-alih timer systemd sedang menjalankan certbot - baca lebih lanjut tentang penghitung waktu certbot dan systemd di sini .
Hamish Downer
Terima kasih telah menyebutkan bahwa cronjob sudah diinstal. Saya tidak menyadarinya sampai saya membaca posting Anda.
NilsB
1
Bagi siapa pun yang bertanya-tanya, itu membuatnya berjalan setiap 12 jam. Jawaban lain 43 6 * * *akan membuatnya berjalan setiap hari pukul 6:43 pagi. Sekali sehari sudah mencukupi, tetapi salah satunya berfungsi dengan baik.
orrd
42

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-autoperintah 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-autoskrip 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 --quiettanda 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'
glaux
sumber
1
Saya suka bagaimana ini dijelaskan, merinci restart layanan tidak diperlukan (bisa membuat berantakan jika seseorang melakukan sesuatu di atasnya, memiliki kesempatan dua kali sehari untuk tertangkap) dan menyebutkan hak istimewa yang diperlukan.
Gusstavv Gil
4
Ini tidak benar - itu adalah diperlukan untuk reload server, setidaknya dengan Nginx - nginx muncul untuk cache sertifikat awal dan tidak mendaftarkan sertifikat baru bahkan jika perubahan file. Lihat posting ini untuk info tentang cara menggunakan --renew-hookuntuk memulai kembali setelah pembaruan yang berhasil: guyrutenberg.com/2017/01/01/…
Whatcould
17

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 certbotjika systemd tidak aktif, sehingga Anda tidak dapat menjalankan keduanya).

pengatur waktu systemd

Anda dapat memeriksa timer sistemd Anda menggunakan perintah systemctl list-timers(atau systemctl list-timers --alljika 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.timerdan 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.serviceakan 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

pekerjaan cron

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/certbotadalah file executable dan bahwa /run/systemd/systemadalah tidak sebuah direktori. Hanya melanjutkan ke bit berikutnya jika pemeriksaan ini berhasil.
    • Bagian systemd dari pemeriksaan secara efektif berarti bahwa jika systemd sedang berjalan, jangan jalankan certbot dari pekerjaan cron - serahkan ke timer.
  • perl -e 'sleep int(rand(43200))' - tidur dalam jumlah acak antara 0 detik dan 12 jam (43200 = 12 x 60 x 60).
  • certbot -q renewperiksa sertifikat Anda dan perbarui jika diperlukan. The -qbendera "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.

Hamish Downer
sumber
1
"Anda tidak harus mengatur apa pun" tetapi sertifikat saya berakhir baru-baru ini, dan saya memasang sertifikat sekitar 3 bulan yang lalu. /etc/cron.d/certbotada, systemctl list-timerspertunjukan certbot.timer, tetapi sertifikat saya tidak diperpanjang. Menjalankan certbotsecara manual bekerja dengan baik, jadi saya tidak tahu apa yang terjadi. Akhirnya menambahkan crontabentri sekolah lama .
Dan Dascalescu
Ini adalah jawaban yang paling mutakhir dan benar tetapi dengan peringatan bahwa itu tergantung pada apa yang Anda jalankan: certbot.eff.org/docs/using.html#id8
olive_tree
"dan pekerjaan cron hanya akan berjalan jika systemd tidak aktif". Bisakah Anda membantu menemukan beberapa dokumen tentang "presedensi" ini?
titus
@titus penjelasannya adalah bahwa pekerjaan cron pertama kali dijalankan testuntuk 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.
Hamish Downer
5

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.

shodanshok
sumber
3

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.

Sumber: https://certbot.eff.org/docs/using.html

Tadej
sumber
1
"Silakan pilih satu menit acak dalam satu jam untuk tugas pembaruan Anda."
Isius
1
Per catatan saya di atas, Anda akan lebih baik dengan --renew-hook, yang me-restart server Anda hanya ketika sertifikat tersebut benar-benar diperbarui.
Whatcould
@Isius terima kasih, saya mengubahnya ke menit acak (6).
Tadej
1
@JedatKinports: harus tidak --post-hookdan --renew-hookmenjadi service apache2 restartbukan service restart apache2?
Paul Ratazzi
1
Perintahnya adalah service apache2 restart ! The service restart apache2bukan perintah yang benar / layanan.
GTodorov
1

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
Pavel Niedoba
sumber
1

Anggota lain sudah memberikan jawaban yang lebih detail. Tapi sepertinya aku harus menyebutkannya di sini.

Pada certbot versi 0.21.1 --renew-hookflag diubah menjadi --deploy-hook Pastikan Anda tidak menggunakan flag yang sudah usang.

certbot renew --deploy-hook "systemctl restart myservice"
Shinebayar G
sumber
0

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 -ldan timer systemd $ systemctl list-timers .

Suhayb
sumber