LetsEncrypt certbot несколько повторных крючков

Я могу автоматизировать обновление сертификата SSL из certbot LetsEncrypt. Фактическое обновление работает, но мне нужно автоматизировать перезапуск служб, чтобы они загружали обновленные сертификаты. Мне было интересно, можете ли вы использовать несколько параметров --renew-hook в cronjob для letsencrypt renew?

Как автоматизировать перезапуск служб при обновлении сертификата?

Ответы

Ответ 1

Да, вы можете использовать несколько операторов -newew-hook. также используйте флаг -q, чтобы он посылал вам по электронной почте пустое уведомление до тех пор, пока обновление действительно не произойдет. Он также не перезапускает какие-либо из ваших сервисов до тех пор, пока не произойдет обновление. Это также прикрепляет файл журнала к электронной почте, если вы этого желаете.

У меня есть cron, который ежедневно запускает bash.

Внутри моего bash (certbotrenew.sh) просто это

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

и мой cron

00 20 * * 1 /bin/certbotrenew.sh

Некоторые люди спрашивают, почему я отправляю электронное письмо, независимо от того, произошло ли что-то, я просто хочу знать, что мои ежедневные кроны работают.

Ответ 2

Из того, что я увидел из новой установки в Ubuntu 16.04 CertBot, он создает работу 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/'

Таким образом, он выполняет run-parts во многих каталогах, включая /etc/letsencrypt/renew-hook.d/

Вам просто нужно добавить исполняемый файл в любой из этих каталогов hook (выберите тот, который вам нужен).

Например, в моем renew-hook.d я создал файл restart-nginx со следующим содержимым:

#!/bin/bash
/etc/init.d/nginx restart

В качестве примечания: вы можете узнать, какие файлы будут вызываться с помощью run-parts используя --test. (Пример run-parts --test/etc/letsencrypt/renew-hook.d/

Ответ 3

Вы также можете установить перехваты (и другие параметры, если хотите) в качестве глобальных параметров в файле /etc/letsencrypt/cli.ini (см. Документацию) следующим образом:

# 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

Сначала вы должны создать файл в большинстве систем. Без Letsencrypt.

Вы также можете создать версию, соответствующую сертификату, в каждой папке renewal если вам не нравится глобальный.

Ответ 4

Также есть место, которое контролирует запуск certbot (в Ubuntu 16.04 + nginx - файлы настроек ниже)

1) системный таймер

запустите commnad: sudo systemctl list-timers

и увидеть вывод:

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

затем

2)

проверить файл, который контролирует время, когда systemctl запускает Certbot

/etc/systemd/system/timers.target.wants/certbot.timer

это символическая ссылка для

/lib/systemd/system/certbot.timer

Обратите внимание на эти строки, которые определяют время + случайные секунды (задайте случайное время, чтобы не нагружать серверы letsencrypt)

OnCalendar=--* 00,12:00:00

RandomizedDelaySec=3600

Ответ 5

Последний рекомендуемый метод запуска сценариев /etc/letsencrypt/cli.ini - из /etc/letsencrypt/cli.ini. Если файл отсутствует, вы можете создать его самостоятельно. Другое дело, что вы должны использовать --deploy-hook вместо --renew-hook. --renew-hook все еще присутствует, но будет постепенно сокращаться, так как он даже не упомянут в последней документации.

Поэтому просто создайте /etc/letsencrypt/cli.ini если он не существует, и добавьте следующую строку: deploy-hook = "перезагрузка постфикса службы; перезапуск службы dovecot; перезагрузка службы apache2"

перезагрузить эти конкретные услуги.

Ответ 6

Не уверен, что это только для новых версий или нет, но надеюсь, что кто-то найдет это полезным. Если у вас добавлен хотя бы 1 домен, certbot создаст каталог "renew-hooks" с 3 подкаталогами "deploy", "post", "pre".

Если вы поместите какой-либо скрипт в папку "post", он будет выполнен после обновления автоматически. Не забудьте сделать его исполняемым, добавив +x в скрипт.

Я использую только один "001-restart-nginx.sh" со следующим содержанием:

#!/bin/bash
echo "ssl certs updated" && service nginx restart

/etc/letsencrypt/renewal-hooks/post/001-restart-nginx.sh

Таким образом, вам не нужно вручную --post-hook параметрах --post-hook определенные инструкции.

В процессе обновления вы увидите что-то вроде этого:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/<your-domain-name>/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Running post-hook command: /etc/letsencrypt/renewal-hooks/post/001-restart-nginx.sh
Output from post-hook command 001-restart-nginx.sh:
ssl certs updated