Вопрос: Задание Cron для шифрования обновления


Это правильный способ установить хрон для обновления сертификата Let's Encrypt в Apache2? Я использую Ubuntu 16.04.

@monthly letsencrypt renew && service apache2 reload

55
2017-07-19 19:07


Источник


Как сказано в одном из приведенных ниже ответов, certbot v0.19.0 (а может быть, и раньше) уже создает запись crontab @ /etc/cron.d/certbot - xgMz
Кроме того, плагин certbot apache с проверкой tls-sni перезагрузит apache как часть процедуры проверки после получения нового сертификата. - xgMz


Ответы:


Ежемесячно не достаточно часто. Этот скрипт должен запускаться не реже одного раза в неделю, а предпочтительно ежедневно. Помните, что сертификаты не обновляются, если они не близки к истечению срока действия, а ежемесячные могут привести к тому, что ваши существующие сертификаты будут истекли до их возобновления.

Название программы certbot, который был переименован из letsencrypt, Если вы все еще используете letsencrypt, вам необходимо обновить текущую версию.

Помимо этих вопросов, это примерно то же самое, что и мои работы cron.

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

Обратите внимание, что в 18.04 LTS пакет letencrypt был (окончательно) переименован в certbot. Теперь он включает в себя таймер systemd, который вы можете включить для планирования продлений certbot, с systemctl enable certbot.timer а также systemctl start certbot.timer, Тем не менее, Ubuntu не предоставил способ указать крючки. Вам необходимо настроить переопределение для certbot.service переопределить ExecStart= с вашей желаемой командной строкой, пока Ubuntu не установит это.


94
2017-07-19 19:33



Я могу просто запустить crontab -e и вставить @daily certbot renew && systemctl reload apache2 и это сработает, правильно? Я не очень разбираюсь в Linux. Я не знаю, как протестировать эту работу cron. - user3448600
@ user3448600 Возможно, вы захотите прочитать serverfault.com/q/449651/126632 - Michael Hampton♦
Какое временное окно «близко к истечению»? - Andre Figueiredo
@AndreFigueiredo В моем тестировании сертификат автоматически обновляется примерно за месяц до истечения срока действия сертификата. Я не мог сказать, будет ли ровно 30 дней (я подозреваю, что это так). - glaux
Для apache / httpd, certbot renew будет просто работать - aairey


У меня недостаточно репутации для комментариев, поэтому я отвечу здесь. Я недавно (октябрь 2017 года) установил и запустил certbot на сервере Ubuntu 16.04, и новое задание cron было создано автоматически в /etc/cron.d/certbot,

Вот работа cron, которая была создана:

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

Было бы неплохо проверить, существует ли этот файл перед созданием записи crontab.


37
2017-10-22 15:34



Такая же ситуация для меня. Спасибо за головы! - Osborne Cox
Я видел, что у меня было это и после запуска certbot. Очень приятно, что позволяет шифровать это! Это отличный проект. - Bjorn Tipling
Стоит осознавать, что вышеупомянутая работа cron не будет бег certbot renew если /run/systemd/system присутствует - это потому, что вместо этого таймер systemd запускает certbot - Узнайте больше о certbot и systemd timers здесь, - Hamish Downer


документация certbot рекомендует запускать скрипт два раза в день:

Заметка:

если вы настраиваете работу cron или systemd, мы рекомендуем запускать ее два раза в день (она ничего не сделает, пока ваши сертификаты не будут возвращены или отменены, но регулярное выполнение этого задания даст вашему сайту возможность оставаться в сети в случай, по какой-то причине произошел аннулированный инициированный шифрованием аннулирование). Пожалуйста, выберите случайную минуту в течение часа для выполнения задач продления.

Как отмечает Майкл Хэмптон, имя изменилось на certbot, но они по-прежнему предоставляют опцию -auto, которая постоянно обновляется. certbot-auto команда требует привилегий root для запуска, поэтому строка в вашем скрипте cron должна выглядеть примерно так:

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

В моем собственном случае certbot-auto сценарий помещается в домашний каталог git-пользователя. Точная команда тогда

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

Обратите внимание, что пример в документации соответствует относительному пути, указанному точкой, которая может сбивать с толку:

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

Обязательно сначала протестируйте команду обновления в оболочке, чтобы проверить путь, если сертификат не должен обновляться. Ничего не произойдет (запустите этот тест без --quiet чтобы увидеть, что происходит).

Не обязательно перезагружать сервер, когда сертификат обновляется таким образом, поскольку путь к живому сертификату не изменяется, если он настроен правильно.

Это верно, если вы используете apache - для nginx, подумайте о добавлении нового крючка, например:

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

33
2018-01-09 09:07



Мне нравится, как это объясняется, детализация перезапуска службы не нужна (это может вызвать беспорядок, если кто-то делает что-либо на нем, имея шанс дважды в день, чтобы его поймать) и упоминания о привилегиях. - Gusstavv Gil
Это неправда - это является необходимо перезагрузить сервер, по крайней мере, Nginx-nginx, похоже, кэширует исходный сертификат и не регистрирует новый сертификат, даже если файл изменяется. См. Это сообщение для информации об использовании --renew-hook для возобновления только после успешного продления: guyrutenberg.com/2017/01/01/... - Whatcould


Для продления сертификата LetsEncrypt я обычно использую getssl, Это очень удобная оболочечная оболочка, которая может даже устанавливать сертификат на другие машины через SSH-соединение.

Запись cron следующая:

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

Как уже было сказано, вы должны запускать его ежедневно или, даже лучше, два раза в день.


4
2018-01-09 09:46





Как уже упоминалось глас:

Примечание: если вы настраиваете работу cron или systemd, мы рекомендуем запускать   он дважды в день (он ничего не сделает, пока ваши сертификаты не будут приняты   для продления или аннулирования, но регулярное выполнение этого задания даст ваш сайт   возможность оставаться в сети в случае инициирования шифрования Let's Encrypt   по какой-то причине, аннулирование). Выберите случайную минуту   в течение часа для ваших задач продления.

Источник: https://certbot.eff.org/all-instructions/#debian-8-jessie-apache

Так я закончил использовать это (работает два раза в день, в 01:00 и в 13:00 каждый день):

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

или даже лучше:

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

Я не тестировал, но это тоже должно работать:

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 и -post-hook запускаются до и после каждой попытки обновления. Если вы хотите, чтобы ваш крючок запускался только после успешного продления,   используйте --renew-hook в команде, подобной этой.

Источник: https://certbot.eff.org/docs/using.html


3
2017-07-05 09:49



«Пожалуйста, выберите случайную минуту в течение часа для ваших задач продления». - Isius
В моей заметке выше вам было бы лучше с --renew-hook, который перезагружает ваш сервер только тогда, когда сертификат фактически обновляется. - Whatcould
@Isius спасибо, я поменял его на случайную минуту (6). - JedatKinports
@JedatKinports: не следует --post-hook а также --renew-hook быть service apache2 restart вместо service restart apache2? - Paul Ratazzi
Команда перезагрузка службы apache2! service restart apache2 неправильная команда / служба. - GTodorov


Это то, что я использую:

/opt/letsencrypt/letsencrypt-auto renew

дает результат как:

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)

И его утверждение о том, что apache уже перезагружен, так что не нужно делать это снова. Если я запустил его снова:

Cert not yet due for renewal

поэтому ежедневно не нужно обновлять сертификат, тогда мой cron:

@daily /opt/letsencrypt/cronautorenew.sh

Я использую скрипт для настройки ведения журнала для разделения файла, так что вот мой 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





Вам не нужно ничего настраивать. Любая недавняя установка certbot для Debian / Ubuntu должна установить таймер systemd и задание cron (и задание cron будет выполняться только в том случае, если systemd неактивен, поэтому вы не получите оба запуска).

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

Вы можете проверить свои таймеры systemd с помощью команды systemctl list-timers (или systemctl list-timers --all если вы также хотите показывать неактивные таймеры). Что-то вроде этого:

% 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

Таймер certbot должен быть здесь /lib/systemd/system/certbot.timer и он выполнит команду, указанную в /lib/systemd/system/certbot.service

certbot.timer будет выполнять «certbot.service» в 12:00 и 12:00, после случайной задержки до 12 часов (43200 секунд).

# 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

а также certbot.service выполнит команду renew.

# 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

Как отмечали другие, существует также задание cron, установленное в /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

Это делает:

  • test -x /usr/bin/certbot -a \! -d /run/systemd/system - проверить, если /usr/bin/certbot является исполняемым файлом и /run/systemd/system является не каталог. Продолжайте выполнение следующего бита, если эта проверка завершится успешно.
    • Системная часть проверки эффективно означает, что если systemd запущен, не запускайте certbot из задания cron - оставьте это для таймера.
  • perl -e 'sleep int(rand(43200))' - сбрасывайте случайное количество от 0 секунд до 12 часов (43200 = 12 x 60 x 60).
  • certbot -q renew проверьте свои сертификаты и при необходимости обновите их. -q флаг «тихий» - не производит никакого вывода, если не возникает ошибка.

Сначала меня смущала работа cron, поскольку она не запускалась из-за systemd, так как будет запускать certbot? Я нашел ответ в это сообщение форума на что я основал этот ответ.


0
2017-08-02 20:14