Cron işi için yenilemeyi şifreleyelim


93

Ayarlamak için bu doğru yolu mu cron'u Apache 2'de edelim şifreleme sertifika yenilenmesi için? Ubuntu 16.04 kullanıyorum.

@monthly letsencrypt renew && service apache2 reload

6
Aşağıdaki cevaplardan biri olarak, certbot v0.19.0 (ve belki de daha öncekileri) zaten bir crontab girişi /etc/cron.d/certbot
yarattılar

Ayrıca, tls-sni onaylı certbot apache eklentisi, yeni sertifika alındıktan sonra doğrulama prosedürünün bir parçası olarak apache yeniden yükleyecektir.
xgMz

Aşağıda yeni kurulumlar için çok önemli olan bir cevap var (JAN 2019'dan itibaren), certbot otomatik olarak sistem zamanlayıcı ve cron iş zamanlaması ekler, böylece cron ayarlarına sizin ihtiyaç duymanıza gerek kalmaz.
Cory Robinson

Yanıtlar:


145

Aylık yeterli sıklıkta değildir. Bu komut dosyası en az haftada bir, tercihen de günlük olarak çalışmalıdır. Unutmayın ki, sertifikalar sona erme süresine yakın olmadıkça yenilenmez ve aylık olarak mevcut sertifikalarınızın yenilenmeden önce zaman zaman sona ermesine neden olur.

Programın adı, adı certbotdeğiştirildi letsencrypt. Hala kullanıyorsanız letsencrypt, geçerli sürüme güncellemeniz gerekir.

Bu sorunların yanı sıra, benim cron işlerimle aynı.

43 6 * * * certbot renew --post-hook "systemctl reload nginx"

18.04 LTS'de letsencrypt paketinin (nihayet) certbot olarak yeniden adlandırıldığını unutmayın. Artık systemctl enable certbot.timerve ile certbot yenilemeleri zamanlamak için etkinleştirebileceğiniz bir sistem zamanlayıcı içerir systemctl start certbot.timer. Ancak, Ubuntu kancaları belirtmenin bir yolunu vermedi. Ubuntu bunu düzeltene kadar istediğiniz komut satırını certbot.servicegeçersiz kılmak için bir geçersiz kılma ayarlamanız gerekir ExecStart=.


3
"Zaman aşımına yakın" ne zaman penceresi var?
Andre Figueiredo

3
Kullanıcı --renew-hookyerine --post-hook, yalnızca sertifika başarılı bir şekilde yenilendiğinde yeniden başlatmak daha iyi olabilir .
mwfearnley

6
Apache / httpd için, certbot renewsadece ™ çalışacaktır
aairey

1
Ben sadece bitti sonra web sunucunuzu yeniden certbot.service bir ExecStartPost satırı ekleyin ziyade ExecStart nginx yeniden geçersiz kılma yerine, eklemek istedim: ExecStartPost=/usr/sbin/service nginx reload. Benim için çalıştı!
JD Mallen,

1
@JDMallen Kullanmak ExecStartPost=iyi bir fikirdir. Bunu neden düşünmedim? Ancak servicekomutun kullanımdan kaldırıldığının farkında olun ; sonsuza dek etrafta olmayacak. İlgili systemctlkomutlara geçin .
Michael Hampton

56

Yorum yapacak kadar itibarım yok, bu yüzden burada cevaplayacağım. Geçenlerde (Ekim 2017) bir Ubuntu 16.04 sunucusuna certbot koydum ve otomatik olarak bir yenileme cron işi oluşturuldu /etc/cron.d/certbot.

İşte yaratılan cron işi:

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew

Bir crontab girişi oluşturmadan önce bu dosyanın zaten mevcut olup olmadığını kontrol etmek iyi bir fikir olacaktır.


1
Certbot'u çalıştırdıktan sonra bunu da gördüm. Bunu şifrelemek sağlayan çok güzel! Harika bir proje.
Bjorn

7
Yukarıda cron işi olduğu bilinciyle değer vermez çalıştırmak certbot reneweğer /run/systemd/systemmevcutsa - - Bu yerine systemd zamanlayıcı certbot çalıştığı nedeni certbot ve burada systemd zamanlayıcılar hakkında daha fazla bilgi .
Hamish Downer

Bir cronjob'ın zaten kurulu olduğunu söylediğin için teşekkürler. Görevinizi okuyana kadar bunun farkında değildim.
NilsB

1
Merak edenler için, bu her 12 saatte bir çalışmasını sağlar. Diğer cevap 43 6 * * *her gün saat 6: 43'te çalışmasını sağlar. Günde bir kez yeterli olmalı, ancak biri iyi çalışıyor.
orrd

42

Certbot dokümantasyon günde iki kez komut dosyası çalıştıran önerir:

Not:

Bir cron veya sistem işi oluşturuyorsanız, günde iki kez çalıştırmanızı öneririz (sertifikalarınızın yenilenmesi veya iptal edilmesine kadar hiçbir şey yapmaz, ancak düzenli olarak çalıştırılması sitenize çevrimiçi kalma şansı verir. Bazı nedenlerden dolayı bir Let Encrypt tarafından başlatılan iptal işlemi gerçekleşti). Lütfen yenileme görevleriniz için saat içinde rastgele bir dakika seçin.

Michael Hampton'ın adından da anlaşılacağı gibi, ismin certbot olarak değiştiği belirtiliyor ancak yine de kendisini sürekli güncel tutan -auto seçeneğini sunuyor. certbot-autoCron komut satırı şöyle görünmelidir böylece komut çalıştırmak için kök ayrıcalıkları gerekir:

52 0,12 * * * root /full/path/to/certbot-auto renew --quiet

Benim durumumda certbot-autoscript git-kullanıcının ana klasörüne yerleştirildi. Kesin komut o zaman

52 0,12 * * * root /home/git/certbot-auto renew --quiet

Belgelerdeki örnekte, kafa karıştırıcı olabilecek nokta ile belirtilen göreceli bir yola karşılık geldiğine dikkat edin:

./path/to/certbot-auto renew --quiet

Sertifikanın yenilenmesi nedeniyle bir şey olmuyorsa, yolu test etmek için, yenileme komutunu önceden bir kabuk içinde test ettiğinizden emin olun ( --quietne olduğunu görmek için bu testi bayraksız yapın).

Sertifika bu şekilde yenilendiğinde sunucuyu yeniden yüklemek kesinlikle gerekli değildir, çünkü canlı sertifikaya giden yol doğru kurulursa değişmez.

Apache kullanıyorsanız bu doğrudur - nginx için aşağıdaki gibi bir yenileme kancası eklemeyi düşünün:

52 0,12 * * * root certbot renew --renew-hook 'service nginx reload'

1
Bunun nasıl açıklandığını seviyorum, hizmetin yeniden başlatılması gerekmiyor (biri üzerinde bir şey yapıyorsa, yakalanması için günde iki kez şansı olması gibi) bir karışıklık yaratabilir ve gerekli ayrıcalıklardan bahsedebilirim.
Gusstavv Gil

4
Bu doğru değildir - olduğunu en azından Nginx, sunucuyu yeniden gerekli - nginx ilk sertifikayı önbelleğe görünür ve yeni bir sertifika bile dosya değişiklikleri kaydetmez. Kullanımı hakkında bilgi için bu yazı bakın --renew-hookBaşarılı Yenileme sonrasında sadece yeniden başlatma için: guyrutenberg.com/2017/01/01/...
Whatcould

17

Hiçbir şey ayarlamak zorunda değilsin. Certbot'un herhangi bir yeni Debian / Ubuntu kurulumu bir sistem zamanlayıcı ve bir cron işi kurmalıdır (ve cron işi sadece sistem certbotaktif değilse çalışacaktır ).

sistem zamanlayıcı

Sistemd zamanlayıcılarınızı komut kullanarak kontrol edebilirsiniz systemctl list-timers(ya systemctl list-timers --allda inaktif zamanlayıcıları da göstermek istiyorsanız). Bunun gibi bir şey:

% 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

Sertifika zamanlayıcısı burada olmalı /lib/systemd/system/certbot.timerve belirtilen komutu uygulayacaktır./lib/systemd/system/certbot.service

certbot.timer `certbot.service hizmetini 12 saate kadar (43200 saniyeye kadar) rastgele bir gecikmeden sonra saat 12 ve 12'de gerçekleştirecektir.

# 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

ve certbot.serviceyenileme komutunu uygulayacaktır.

# 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

cron işi

Diğerlerinin de belirttiği gibi, içine kurulmuş bir cron işi var /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

Bu yapıyor:

  • test -x /usr/bin/certbot -a \! -d /run/systemd/system- /usr/bin/certbotÇalıştırılabilir bir dosya /run/systemd/systemolup olmadığını ve bir dizin olup olmadığını kontrol edin . Sadece bu kontrol başarılı olursa bir sonraki bit ile devam edin.
    • Kontrolün systemd kısmı, sistemd çalışıyorsa, certbot'u cron işinden çalıştırmamanız anlamına gelir - bunu zamanlayıcıya bırakın.
  • perl -e 'sleep int(rand(43200))' - 0 saniye ile 12 saat arasında rastgele bir miktar uyku (43200 = 12 x 60 x 60).
  • certbot -q renewsertifikalarınızı kontrol edin ve gerekirse yenileyin. -qBayrak "sessiz" dir - Bir hata olmadığı sürece herhangi bir çıktı üretmez.

Başlangıçta cron işi tarafından sistemd nedeniyle çalışmayacağı için kafam karışmıştı, peki certbot nasıl çalıştırılırdı? Cevabı bu forum yazısında buldum .


1
"Hiçbir şey ayarlamanıza gerek kalmamalıydı" ama son zamanlarda sertifikamın süresi doldu ve yaklaşık 3 ay önce sertifika kurdum. /etc/cron.d/certbotvar, systemctl list-timersgösterileri var certbot.timer, ama param yenilenmedi. certbotElle koşmak iyi çalıştı, bu yüzden ne olduğunu bilmiyorum. Eski bir okul crontabgirişi ekleyerek sona erdi .
Dan Dascalescu,

Bu en güncel ve doğru cevaptır ancak ne kadar çalıştığınıza bağlı olduğuna dair bir uyarı ile: certbot.eff.org/docs/using.html#id8
olive_tree 22:18

"ve cron işi sadece systemd aktif değilse çalışacaktır". Lütfen açıklanan "öncelik" hakkında bir doktor bulmaya yardım eder misiniz?
titus

@titus açıklaması, cron işinin öncelikle systemd'nin testetkin olup olmadığını kontrol etmek için bir çalıştırması ve cron işinin çalışmadan hemen çıkmadan devam etmesidir certbot- cron işi ile ilgili metne bakın. Metni daha kesin olacak şekilde düzenleyeceğim.
Hamish Downer

5

LetsEncrypt sertifika yenilemesi için genellikle getssl kullanıyorum . SSH bağlantısı ile diğer makinelere sertifika bile yükleyebilen çok kullanışlı bir kabuk ambalajıdır.

Cron girişi şudur:

01 23 * * * root /root/scripts/getssl/getssl -u -a -q >>/var/log/getssl.log 2>&1 ; /usr/sbin/apache2ctl graceful

Daha önce de belirtildiği gibi, günlük olarak veya daha iyisi günde iki kez çalıştırmalısınız.


3

Glaux tarafından daha önce belirtildiği gibi:

Not: Bir cron veya sistem işi oluşturuyorsanız, günde iki kez çalıştırmanızı öneririz (sertifikalarınızın yenilenmesi veya iptal edilmesi gerekene kadar hiçbir şey yapmaz, ancak düzenli olarak çalıştırılması sitenize kalma şansını verir bazı nedenlerden dolayı, Let Encrypt tarafından başlatılan bir iptal işlemi olması durumunda çevrimiçi olabilir). Lütfen yenileme görevleriniz için saat içinde rastgele bir dakika seçin.

Kaynak: https://certbot.eff.org/all-instructions/#debian-8-jessie-apache

Ben de bunu kullanarak bittim (koşmak günde iki kez, 01: 00'da ve her gün 13: 00'da):

6 1,13 * * * certbot renew --post-hook "service apache2 restart"

veya daha da iyisi:

6 1,13 * * * certbot renew --renew-hook "service apache2 restart"

Test etmedim ama bu da işe yaramalı:

6 1,13 * * * certbot renew --post-hook "/etc/init.d/apache2 restart"
6 1,13 * * * certbot renew --renew-hook "/etc/init.d/apache2 restart"

- Ön-kanca ve - Ön-kanca kancaları her yenileme denemesinden önce ve sonra çalıştırılır. Kancanızın ancak başarılı bir yenilemeden sonra çalışmasını istiyorsanız, --renew-hook komutunu böyle bir komutla kullanın.

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


1
"Lütfen yenileme görevleriniz için saat içinde rastgele bir dakika seçin."
Isius,

1
Yukarıdaki --renew-hooknotuma göre, yalnızca gerçekte yenilendiğinde sunucunuzu yeniden başlatan daha iyi olurdu .
17:48

@Isius teşekkürler, rastgele bir dakikaya değiştirdim (6).
Tadej

1
@JedatKinports: yerine --post-hookve --renew-hookolmamalı ? service apache2 restartservice restart apache2
Paul Ratazzi

1
Komut hizmet apache2 yeniden başlatma ! service restart apache2Doğru komut / hizmeti değildir.
GTodorov

1

Kullandığım şey bu:

/opt/letsencrypt/letsencrypt-auto renew

çıktı olarak verir:

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)

Ve apache'nin şimdiden başlatıldığını söylemesi, tekrar yapmanıza gerek yok. Tekrar çalıştırırsam:

Cert not yet due for renewal

bu nedenle günlük sertifikayı yenilemek sorun değil, benim cronum:

@daily /opt/letsencrypt/cronautorenew.sh

Dosyayı ayırmak için günlüğü değiştirmek için komut dosyası kullanıyorum, işte benim cronautorenew.sh:

#!/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

1

Diğer üyeler zaten çok daha ayrıntılı cevaplar verdi. Ama burada belirtmeliyim gibi görünüyor.

Certbot sürüm 0.21.1'den itibaren --renew-hookbayrak, --deploy-hook kullanımdan kaldırılmış bayrak kullanmadığınızdan emin olun.

certbot renew --deploy-hook "systemctl restart myservice"

0

Göre EFF certbot rehberi

Çoğu Linux dağıtımı, sistem paket yöneticileri aracılığıyla yüklenen paketleri kullandığınızda otomatik yenileme sağlar.

Eğer sistem bu zaten otomatik olup olmadığını emin değilseniz, sistem kontrol crontab tipik içinde ( /etc/crontab/ve /etc/cron.*/* $ crontab -lve systemd zamanlayıcılar $ systemctl list-timers .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.