J'automatise un renouvellement de certificat SSL à partir du certbot de LetsEncrypt. Le renouvellement actuel fonctionne, mais je dois automatiser le redémarrage des services pour qu'ils chargent les certificats renouvelés. Je me demandais si vous pouviez utiliser plusieurs paramètres --renew-hook
dans le travail cron pour letsencrypt renew
?
Comment automatiser le redémarrage des services lors du renouvellement du certificat?
Oui, vous pouvez utiliser plusieurs instructions --renew-hook. utilisez également l’option -q pour qu’il vous envoie une notification vierge jusqu’à ce qu’un renouvellement se produise. En outre, aucun de vos services ne redémarre jusqu'à ce qu'un renouvellement soit effectué. Cela joint également le fichier journal à l’email si vous le souhaitez.
J'ai un cron qui court tous les jours.
Dans mon bash (certbotrenew.sh) se trouve simplement ceci
#!/bin/bash
cd /opt/certbot
Sudo ./certbot-auto renew --renew-hook "service postfix reload" --renew-hook "service dovecot restart" --renew-hook "service Apache2 reload" -q >> /var/log/certbot-renew.log | mail -s "CERTBOT Renewals" [email protected] < /var/log/certbot-renew.log
exit 0
et mon cron est
00 20 * * 1 /bin/certbotrenew.sh
Certaines personnes se demandent pourquoi j'envoie un email, que rien ne se passe, j'aime toujours savoir que mes affaires quotidiennes fonctionnent.
D'après ce que j'ai vu de la nouvelle installation Ubuntu 16.04 de CertBot, cela crée un travail cron:
# /etc/cron.d/certbot: crontab entries for the certbot package
#
# Upstream recommends attempting renewal twice a day
#
# 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(3600))' && certbot -q renew --pre-hook
'/bin/run-parts /etc/letsencrypt/pre-hook.d/' --post-hook '/bin/run-parts /etc/letsencrypt/post-hook.d/' --renew-hook '/bin/run-parts
/etc/letsencrypt/renew-hook.d/'
Donc, il exécute run-parts
sur plusieurs répertoires, y compris /etc/letsencrypt/renew-hook.d/
Vous devez simplement ajouter un fichier exécutable dans l’un de ces répertoires de raccordement (choisissez celui dont vous avez besoin).
Par exemple, dans mon renew-hook.d
, j'ai créé un fichier restart-nginx
avec le contenu suivant:
#!/bin/bash
/etc/init.d/nginx restart
Remarque: vous pouvez savoir quels fichiers seront appelés par run-parts
à l'aide de l'option --test
. (Exemple run-parts --test /etc/letsencrypt/renew-hook.d/
Vous pouvez également définir les points d'ancrage (et d'autres options si vous le souhaitez) comme options globales dans le fichier /etc/letsencrypt/cli.ini
( voir documentation ) comme ceci:
# Global config for letsencrypt runs
#
# Note that these options apply automatically to all use of Certbot for
# obtaining or renewing certificates, so options specific to a single
# certificate on a system with several certificates should not be placed
# here.
renew-hook = service postfix reload
post-hook = service nginx reload
Vous devez d'abord créer le fichier sur la plupart des systèmes. Letsencrypt vient sans.
Vous pouvez également créer une version spécifique au certificat dans chaque dossier renewal
si vous n'aimez pas devenir global.
La dernière méthode recommandée pour exécuter les scripts de raccordement provient de /etc/letsencrypt/cli.ini
. Si le fichier n'est pas présent, vous pouvez le créer vous-même. Une autre chose est que vous devriez utiliser --deploy-hook
à la place de --renew-hook
. --renew-hook est toujours présent mais sera progressivement supprimé car il n'est même pas mentionné dans la documentation la plus récente.
Créez donc simplement /etc/letsencrypt/cli.ini
s'il n'existe pas et ajoutez la ligne suivante: Deploy-hook = "service postfix reload; service dovecot restart; service Apache2 reload"
pour recharger ces services particuliers.
Il y a aussi un endroit qui contrôle certbot en cours d'exécution (sous Ubuntu 16.04 + nginx, j'ai sous les fichiers de paramètres)
1) minuterie systemd
lancer commnad: Sudo systemctl list-timers
et voir la sortie:
Sun 2018-07-08 00:46:59 EEST 7h left Sat 2018-07-07 12:36:26 EEST 4h 51min ago certbot.timer certbot.service
puis
2)
aller vérifier le fichier qui contrôle le temps quand systemctl exécute Certbot
/etc/systemd/system/timers.target.wants/certbot.timer
c'est un lien symbolique pour
/lib/systemd/system/certbot.timer
Faites attention à ces lignes qui définissent des temps + secondes aléatoires (définir un temps aléatoire afin de ne pas stresser simultanément permet de chiffrer les serveurs)
OnCalendar=--* 00,12:00:00
RandomizedDelaySec=3600