it-swarm.com.de

Cron-Job für die Verschlüsselung der Erneuerung

Ist dies der richtige Weg, um cron für die Erneuerung des Let's Encrypt-Zertifikats in Apache2 festzulegen? Ich benutze Ubuntu 16.04.

@monthly letsencrypt renew && service Apache2 reload
104
user3448600

Monatlich ist nicht häufig genug. Dieses Skript sollte mindestens wöchentlich und vorzugsweise täglich ausgeführt werden. Denken Sie daran, dass Zertifikate erst erneuert werden, wenn sie kurz vor dem Ablauf stehen. Monatlich werden Ihre vorhandenen Zertifikate gelegentlich bereits abgelaufen, bevor sie erneuert werden.

Der Name des Programms lautet certbot und wurde von letsencrypt umbenannt. Wenn Sie immer noch letsencrypt verwenden, müssen Sie auf die aktuelle Version aktualisieren.

Abgesehen von diesen Problemen ist es ungefähr das Gleiche wie meine Cron-Jobs.

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

Beachten Sie, dass in 18.04 LTS das letsencrypt-Paket (endgültig) in certbot umbenannt wurde. Es enthält jetzt einen System-Timer, mit dem Sie Certbot-Erneuerungen mit systemctl enable certbot.timer Und systemctl start certbot.timer Planen können. Ubuntu bot jedoch keine Möglichkeit, Hooks anzugeben. Sie müssen eine Überschreibung für certbot.service Einrichten, um ExecStart= Mit Ihrer gewünschten Befehlszeile zu überschreiben, bis Ubuntu dies behebt.

158
Michael Hampton

Ich habe nicht genug Ruf, um einen Kommentar abzugeben, deshalb werde ich hier antworten. Ich habe kürzlich (Oktober 2017) certbot auf einem Ubuntu 16.04-Server installiert und ausgeführt, und in /etc/cron.d/certbot Wurde automatisch ein Cron-Erneuerungsjob erstellt.

Hier ist der Cron-Job, der erstellt wurde:

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

Es ist eine gute Idee, vor dem Erstellen eines Crontab-Eintrags zu überprüfen, ob diese Datei bereits vorhanden ist.

61
ishigoya

Die certbot-Dokumentation empfiehlt, das Skript zweimal täglich auszuführen:

Hinweis:

wenn Sie einen Cron- oder Systemd-Job einrichten, empfehlen wir, ihn zweimal täglich auszuführen (er wird nichts tun, bis Ihre Zertifikate erneuert oder widerrufen werden müssen. Wenn Sie ihn jedoch regelmäßig ausführen, hat Ihre Site die Möglichkeit, online zu bleiben Fall aus irgendeinem Grund ist ein von Let's Encrypt initiierter Widerruf aufgetreten. Bitte wählen Sie innerhalb einer Stunde eine zufällige Minute für Ihre Erneuerungsaufgaben.

Wie Michael Hampton erwähnt, hat sich der Name in certbot geändert, aber sie bieten immer noch die Option -auto, die sich selbst auf dem Laufenden hält. Der Befehl certbot-auto Benötigt Root-Berechtigungen, damit die Zeile in Ihrem Cron-Skript ungefähr so ​​aussieht:

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

In meinem Fall wird das Skript certbot-auto Im Home-Verzeichnis des Git-Benutzers abgelegt. Der genaue Befehl lautet dann

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

Beachten Sie, dass das Beispiel in der Dokumentation einem relativen Pfad entspricht, wie durch den Punkt angegeben, was verwirrend sein kann:

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

Stellen Sie sicher, dass Sie den Erneuerungsbefehl zuvor in einer Shell testen, um den Pfad zu testen. Wenn das Zertifikat nicht zur Erneuerung fällig ist, geschieht nichts (führen Sie diesen Test ohne das Flag --quiet Aus, um zu sehen, was passiert).

Es ist nicht unbedingt erforderlich, den Server neu zu laden, wenn das Zertifikat auf diese Weise erneuert wird, da sich der Pfad zum Live-Zertifikat bei korrekter Einrichtung nicht ändert.

Dies ist der Fall, wenn Sie Apache ausführen. Für Nginx sollten Sie einen Erneuerungs-Hook hinzufügen, z.

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

Sie sollten nichts einrichten müssen. Bei jeder kürzlich durchgeführten Debian/Ubuntu-Installation von certbot sollten ein Systemd-Timer und ein Cron-Job installiert werden (und der Cron-Job wird nur certbot ausgeführt, wenn systemd nicht aktiv ist, sodass nicht beide ausgeführt werden).

systemd Timer

Sie können Ihre System-Timer mit dem Befehl systemctl list-timers Überprüfen (oder systemctl list-timers --all, Wenn Sie auch inaktive Timer anzeigen möchten). Etwas wie das:

% 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

Der Certbot-Timer sollte hier sein /lib/systemd/system/certbot.timer Und er führt den in /lib/systemd/system/certbot.service Angegebenen Befehl aus.

certbot.timer Führt den `certbot.service um 12 Uhr und 12 Uhr nach einer zufälligen Verzögerung von bis zu 12 Stunden (43200 Sekunden) aus.

# 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

und certbot.service führt den Erneuerungsbefehl aus.

# 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

Wie andere bereits erwähnt haben, ist in /etc/cron.d/certbot Auch ein Cron-Job installiert:

# 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

Das macht:

  • test -x /usr/bin/certbot -a \! -d /run/systemd/system - Überprüfen Sie, ob /usr/bin/certbot Eine ausführbare Datei ist und ob /run/systemd/system kein Verzeichnis ist. Fahren Sie nur mit dem nächsten Bit fort, wenn diese Prüfung erfolgreich ist.
    • Der systemd-Teil der Prüfung bedeutet effektiv, dass wenn systemd ausgeführt wird, kein Certbot vom Cron-Job ausgeführt wird - überlassen Sie dies dem Timer.
  • Perl -e 'sleep int(Rand(43200))' - schlaf eine zufällige Menge zwischen 0 Sekunden und 12 Stunden (43200 = 12 x 60 x 60).
  • certbot -q renew Überprüfen Sie Ihre Zertifikate und erneuern Sie sie bei Bedarf. Das Flag -q Ist "leise" - erzeugen Sie keine Ausgabe, es sei denn, es liegt ein Fehler vor.

Ich war ursprünglich verwirrt von dem Cron-Job, da er aufgrund von systemd nicht ausgeführt werden würde. Wie würde certbot also ausgeführt werden? Ich fand die Antwort in dieser Forumsbeitrag worauf ich diese Antwort basierte.

22
Hamish Downer

Für die Erneuerung des LetsEncrypt-Zertifikats verwende ich im Allgemeinen getssl . Es ist ein sehr praktischer Shell-Wrapper, der sogar Zertifikate über eine SSH-Verbindung auf anderen Computern installieren kann.

Der Cron-Eintrag lautet wie folgt:

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

Wie bereits vorgeschlagen, sollten Sie es täglich oder, noch besser, zweimal täglich ausführen.

5
shodanshok

Wie bereits von Glaux erwähnt:

Hinweis: Wenn Sie einen Cron- oder Systemd-Job einrichten, empfehlen wir, ihn zweimal täglich auszuführen (er wird erst dann ausgeführt, wenn Ihre Zertifikate erneuert oder widerrufen werden müssen. Wenn Sie ihn jedoch regelmäßig ausführen, hat Ihre Site die Möglichkeit, zu bleiben online, falls aus irgendeinem Grund ein von Let's Encrypt initiierter Widerruf stattgefunden hat). Bitte wählen Sie innerhalb einer Stunde eine zufällige Minute für Ihre Erneuerungsaufgaben.

Quelle: https://certbot.eff.org/all-instructions/#debian-8-jessie-Apache

Also habe ich das benutzt (Laufen ist zweimal am Tag, jeden Tag um 01:00 Uhr und um 13:00 Uhr):

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

oder noch besser:

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

Ich habe nicht getestet, aber das sollte auch funktionieren:

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- und --post-hook-Hooks werden vor und nach jedem Erneuerungsversuch ausgeführt. Wenn Sie möchten, dass Ihr Hook erst nach einer erfolgreichen Verlängerung ausgeführt wird, verwenden Sie --renew-hook in einem Befehl wie diesem.

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

3
Tadej

Andere Mitglieder gaben bereits viel detailliertere Antworten. Aber es sieht so aus, als sollte ich es hier erwähnen.

Ab Certbot Version 0.21.1 wird das Flag --renew-hook In --deploy-hook Geändert. Stellen Sie sicher, dass Sie kein veraltetes Flag verwenden.

certbot renew --deploy-hook "systemctl restart myservice"
2
Shinebayar G

Das benutze ich:

/opt/letsencrypt/letsencrypt-auto renew

gibt Ausgabe aus 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)

Und es heißt, dass Apache bereits neu gestartet wurde, sodass Sie es nicht noch einmal wiederholen müssen. Wenn ich es erneut starte:

Cert not yet due for renewal

daher ist es kein Problem, das Zertifikat täglich zu erneuern. Mein Cron ist dann:

@daily /opt/letsencrypt/cronautorenew.sh

Ich verwende ein Skript, um die Protokollierung zu optimieren und die Datei zu trennen. Hier ist also meine 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
Pavel Niedoba

Laut EFF certbot guide

Viele Linux-Distributionen bieten eine automatische Verlängerung, wenn Sie die über ihren Systempaket-Manager installierten Pakete verwenden.

Wenn Sie nicht sicher sind, ob dies auf Ihrem System bereits automatisiert ist, überprüfen Sie die Crontab Ihres Systems (normalerweise in /etc/crontab/ und /etc/cron.*/*$ crontab -l und Systemd-Timer $ systemctl list-timers.

0
Suhayb