Vraag Cron-taak voor laten we versleuteling vernieuwen


Is dit de juiste manier om in te stellen cron voor vernieuwing van Let's Encrypt cert in Apache2? Ik gebruik Ubuntu 16.04.

@monthly letsencrypt renew && service apache2 reload

67
2017-07-19 19:07


oorsprong


Als een van de antwoorden hieronder staat, maakt certbot v0.19.0 (en misschien wat eerder) al een crontab-ingang @ /etc/cron.d/certbot - xgMz
Ook zal de certbot apache plugin met de tls-sni-validatie apache herladen als onderdeel van de validatieprocedure nadat het nieuwe certificaat is opgehaald. - xgMz


antwoorden:


Maandelijks komt niet vaak genoeg voor. Dit script moet minstens wekelijks worden uitgevoerd, en bij voorkeur dagelijks. Houd er rekening mee dat certificaten niet worden verlengd tenzij ze bijna zijn verlopen en maandelijks ertoe leiden dat uw bestaande certificaten af ​​en toe al zijn verlopen voordat ze worden vernieuwd.

De naam van het programma is certbot, waarvan de naam is gewijzigd in letsencrypt. Als je nog steeds gebruikt letsencrypt, moet u bijwerken naar de huidige versie.

Afgezien van deze problemen is het ongeveer hetzelfde als mijn cron-taken.

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

Merk op dat in 18.04 LTS het letsencrypt-pakket (eindelijk) hernoemd is naar certbot. Het bevat nu een systemd-timer die u kunt inschakelen om certbot-verlengingen in te plannen, met systemctl enable certbot.timer en systemctl start certbot.timer. Ubuntu bood echter geen manier om haken op te geven. U moet een overschrijving instellen voor certbot.service overschrijven ExecStart= met uw gewenste opdrachtregel, totdat Ubuntu dit probleem oplost.


102
2017-07-19 19:33



Ik kan gewoon rennen crontab -e en plak @daily certbot renew && systemctl reload apache2 en het zal werken, toch? Ik ben niet zo ervaren met Linux. Ik weet niet hoe ik deze cron-taken moet testen. - user3448600
@ user3448600 Misschien wilt u lezen serverfault.com/q/449651/126632 - Michael Hampton♦
Welk tijdvenster is "bijna verlopen"? - Andre Figueiredo
@AndreFigueiredo Bij mijn testen wordt het certificaat ongeveer een maand voordat het certificaat verloopt vernieuwd. Ik kon niet zeggen of het precies 30 dagen is (ik vermoed van wel). - glaux
Voor apache / httpd, certbot renew zal gewoon werken - aairey


Ik heb niet genoeg reputatie om commentaar te geven, dus ik zal hier antwoorden. Ik heb onlangs (oktober 2017) certbot op een Ubuntu 16.04-server geïnstalleerd en uitgevoerd en er is automatisch een vernieuwingscron-taak gemaakt in /etc/cron.d/certbot.

Dit is de cron-taak die is gemaakt:

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

Het is een goed idee om te controleren of dit bestand al bestaat voordat u een crontab-item maakt.


42
2017-10-22 15:34



Dezelfde situatie voor mij. Bedankt voor de heads-up! - Osborne Cox
Ik zag dat ik dit ook had na het runnen van certbot. Heel leuk dat coderen dit heeft gedaan! Het is een geweldig project. - Bjorn Tipling
Het is de moeite waard om je ervan bewust te zijn dat de bovenstaande cron-taak zal niet rennen certbot renew als /run/systemd/system is aanwezig - dit is omdat in plaats daarvan een systemd timer certbot draait - lees hier meer over certbot- en systemd-timers. - Hamish Downer


De certbot documentatie beveelt aan het script twee keer per dag uit te voeren:

Notitie:

Als u een cron- of systemd-taak opzet, raden we aan het tweemaal per dag uit te voeren (het doet niets totdat uw certificaten moeten worden verlengd of ingetrokken, maar als u het regelmatig uitvoert, heeft uw site de kans om online te blijven in geval een Let's Encrypt-geïnitieerde intrekking gebeurde om een ​​of andere reden). Selecteer een willekeurige minuut binnen het uur voor uw verlengingstaken.

Zoals Michael Hampton vermeldt, is de naam gewijzigd in certbot, maar ze bieden nog steeds de optie -auto die zichzelf bijwerkt. De certbot-auto commando nodig root privileges om uit te voeren, dus de regel in je cron script zou er ongeveer zo uit moeten zien:

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

In mijn eigen geval de certbot-auto script wordt in de hoofddirectory van de git-gebruiker geplaatst. Het exacte commando is dan

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

Merk op dat het voorbeeld in de documentatie overeenkomt met een relatief pad, zoals aangegeven door de punt, wat verwarrend kan zijn:

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

Zorg ervoor dat u het vernieuwingsopdracht in een shell van tevoren test om het pad te testen. Als het certificaat niet wordt verlengd, gebeurt er niets (voer deze test uit zonder de --quiet vlag om te zien wat er gebeurt).

Het is niet strikt noodzakelijk om de server opnieuw te laden wanneer het certificaat op deze manier wordt vernieuwd, omdat het pad naar het live certificaat niet verandert als het correct is ingesteld.

Dit is waar als je apache draait - voor nginx, overweeg een vernieuwende haak toe te voegen, zoals:

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

35
2018-01-09 09:07



Ik hou ervan hoe dit wordt uitgelegd, detaillering van het opnieuw opstarten van de service is niet nodig (het kan een puinhoop maken als iemand er iets op doet, twee keer per dag kans heeft om gepakt te worden) en de benodigde rechten vermeldt. - Gusstavv Gil
Dit is niet waar - het is noodzakelijk om de server opnieuw te laden, tenminste met Nginx - nginx lijkt het oorspronkelijke certificaat in de cache op te slaan en registreert geen nieuw cert, zelfs als het bestand verandert. Zie dit bericht voor informatie over het gebruik van --renew-hook om alleen opnieuw op te starten na een succesvolle verlenging: guyrutenberg.com/2017/01/01/... - Whatcould


Voor LetsEncrypt-certificaatvernieuwing gebruik ik over het algemeen getssl. Het is een zeer handige shell-wrapper die zelfs een certificaat op andere machines kan installeren via een SSH-verbinding.

De cron-invoer is de volgende:

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

Zoals al gesuggereerd, moet u het dagelijks of, beter nog, tweemaal per dag uitvoeren.


4
2018-01-09 09:46





Zoals al vermeld door glaux:

Opmerking: als u een cron- of systemd-taak instelt, raden we aan om te starten   het twee keer per dag (het doet niets totdat uw certificaten verschuldigd zijn   voor verlenging of herroeping, maar als u deze regelmatig uitvoert, krijgt u uw site   een kans om online te blijven in het geval van een door Let's Encrypt geïnitieerde   intrekking gebeurde om een ​​of andere reden). Selecteer een willekeurige minuut   binnen het uur voor uw verlengingstaken.

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

Dus ik heb dit uiteindelijk gebruikt (rennen is twee keer per dag, om 01:00 en om 13:00 elke dag):

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

of nog beter:

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

Ik heb niet getest, maar dit zou ook moeten werken:

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 en - post-hook hooks lopen voor en na elke hernieuwingspoging. Als u wilt dat uw hook alleen na een succesvolle verlenging wordt uitgevoerd,   gebruik -nieuwe-haak in een opdracht als deze.

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


3
2017-07-05 09:49



"Selecteer een willekeurige minuut binnen het uur voor uw verlengingstaken." - Isius
Volgens mijn opmerking hierboven zou je er beter af zijn --renew-hook, die uw server alleen opnieuw opstart wanneer het certificaat daadwerkelijk wordt vernieuwd. - Whatcould
@Isius bedankt, ik heb het in een willekeurige minuut veranderd (6). - JedatKinports
@JedatKinports: mag niet de --post-hook en --renew-hook worden service apache2 restart in plaats van service restart apache2? - Paul Ratazzi
Het commando is service apache2 opnieuw opstarten! De service restart apache2 is geen correcte commando / service. - GTodorov


Dit is wat ik gebruik:

/opt/letsencrypt/letsencrypt-auto renew

geeft output als:

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)

En het zegt dat apache alweer is opgestart, dus het is niet nodig om het opnieuw te doen. Als ik het opnieuw doe:

Cert not yet due for renewal

daarom is het geen probleem om het certificaat dagelijks te vernieuwen, mijn cron is dan:

@daily /opt/letsencrypt/cronautorenew.sh

Ik gebruik een script om het loggen te tweaken om het bestand te scheiden, dus hier is mijn 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
2017-10-10 11:50





U zou niets moeten opzetten. Bij elke recente Debian / Ubuntu-installatie van certbot moet een systemd-timer en een cron-taak worden geïnstalleerd (en de cron-taak wordt alleen uitgevoerd als systemd niet actief is, zodat u niet allebei kunt uitvoeren).

systemd timer

U kunt uw systemd-timers controleren met behulp van de opdracht systemctl list-timers (of systemctl list-timers --all als u ook inactieve timers wilt weergeven). Iets zoals dit:

% 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

De certbot-timer zou hier moeten zijn /lib/systemd/system/certbot.timer en het zal het commando uitvoeren gespecificeerd in /lib/systemd/system/certbot.service

certbot.timer zal de `certbot.service uitvoeren om 12 uur en 12 uur, na een willekeurige vertraging van maximaal 12 uur (43200 seconden).

# 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

en certbot.service voert het vernieuwingsbevel uit.

# 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 job

Zoals anderen al hebben vermeld, is er ook een cron-taak geïnstalleerd in /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

Dit gaat doen:

  • test -x /usr/bin/certbot -a \! -d /run/systemd/system - controleer of /usr/bin/certbot is een uitvoerbaar bestand en dat /run/systemd/system is niet een map. Ga alleen door naar het volgende bit als deze controle slaagt.
    • Het systematische deel van de controle betekent in feite dat als systemd wordt uitgevoerd, certbot niet vanuit de cron-job wordt uitgevoerd - laat dat maar aan de timer over.
  • perl -e 'sleep int(rand(43200))' - slaap een willekeurige hoeveelheid tussen 0 seconden en 12 uur (43200 = 12 x 60 x 60).
  • certbot -q renew controleer uw certificaten en vernieuw indien nodig. De -q vlag is "stil" - produceer geen uitvoer tenzij er een fout is.

Ik was oorspronkelijk in de war door de cron-taak omdat het niet te wijten was aan systemd, dus hoe zou certbot worden uitgevoerd? Ik heb het antwoord gevonden deze forumbericht waarop ik dit antwoord baseerde.


1
2017-08-02 20:14



"U hoeft niets te hoeven instellen", maar mijn certificaat is onlangs verlopen en ik heb certbot ongeveer 3 maanden geleden geïnstalleerd. /etc/cron.d/certbot bestaat, systemctl list-timers shows certbot.timer, maar mijn certificaten zijn niet vernieuwd. hardlopen certbot handmatig werkte prima, dus ik weet niet wat er aan de hand is. Eindigde met het toevoegen van een oude school crontab binnenkomst. - Dan Dascalescu