Задание Cron для шифрования обновления

93

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

@monthly letsencrypt renew && service apache2 reload
user3448600
источник
6
Как указано в одном из ответов ниже, certbot v0.19.0 (а может быть, и раньше) уже создает запись в crontab @/etc/cron.d/certbot
xgMz
Кроме того, плагин certbot apache с проверкой tls-sni перезагрузит apache как часть процедуры проверки после получения нового сертификата.
xgMz
Ниже приведен ответ, который очень важен для новых установок (начиная с JAN 2019), certbot автоматически добавляет системный таймер и расписание работы cron, поэтому настройка cron с вашей стороны не требуется.
Кори Робинсон

Ответы:

145

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

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

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

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

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

Майкл Хэмптон
источник
3
Какое временное окно "близко к истечению"?
Андре Фигейредо
3
Это может быть лучше пользователю --renew-hookвместо того --post-hook, чтобы только перезапустить , если сертификат успешно продлен.
mwfearnley
6
Для apache / httpd certbot renewпросто будет работать ™
aairey
1
Я просто хотел бы добавить, а не перекрывать ExecStart перезагрузить Nginx, просто добавьте ExecStartPost строку certbot.service , чтобы перезагрузить веб - сервер после того, как это делается: ExecStartPost=/usr/sbin/service nginx reload. Работал на меня!
Джей Ди Маллен
1
@JDMallen Использование ExecStartPost=- хорошая идея. Почему я не подумал об этом? Но имейте в виду, что serviceкоманда устарела; это не будет вечно. Переключитесь на соответствующие systemctlкоманды.
Майкл Хэмптон
56

У меня недостаточно репутации, чтобы комментировать, поэтому я отвечу здесь. Недавно (октябрь 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.

ishigoya
источник
1
Я видел, что у меня это тоже было после запуска certbot. Очень приятно, что позволяет шифровать это! Это отличный проект.
Бьорн
7
Стоит знать, что указанное выше задание cron не будет запускаться, certbot renewесли /run/systemd/systemоно присутствует - это потому, что вместо этого системный таймер выполняет certbot - узнайте больше о certbot и системных таймерах здесь .
Хэмиш Даунер
Спасибо за упоминание, что cronjob уже был установлен. Я не знал об этом, пока не прочитал твой пост.
NilsB
1
Для тех, кто интересуется, это заставляет его работать каждые 12 часов. Другой ответ 43 6 * * *заставил бы это бежать каждый день в 6:43. Один раз в день должно быть достаточно, но любой из них работает нормально.
orrd
42

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

Примечание:

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

Как Майкл Хэмптон упоминает, что имя изменилось на certbot, но они все еще предоставляют опцию -auto, которая постоянно обновляется. Для certbot-autoзапуска этой команды нужны привилегии суперпользователя, поэтому строка в вашем скрипте 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'
GLaux
источник
1
Мне нравится, как это объясняется, детализировать перезапуск службы не нужно (это может привести к беспорядку, если кто-то что-то делает с этим, имея шанс попасться два раза в день) и упоминать необходимые привилегии.
Gusstavv Gil
4
Это не верно - это является необходимым , чтобы перезагрузить сервер, по крайней мере , с Nginx - Nginx появляется кэшировать первоначальный сертификат и не зарегистрировать новый сертификат , даже если изменения файла. См. Этот пост для получения информации об использовании, --renew-hookчтобы перезапустить только после успешного обновления: guyrutenberg.com/2017/01/01/…
Whatcould
17

Вам не нужно ничего настраивать. Любая недавняя установка certbot в Debian / Ubuntu должна устанавливать системный таймер и задание cron (и задание cron будет запускаться только в том certbotслучае, если 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выполнит команду возобновления.

# 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, установленное в /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 х 60 х 60).
  • certbot -q renewпроверьте свои сертификаты и обновите, если требуется. -qФлаг «тихий» - не производят никакого вывода , если нет ошибки.

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

Хэмиш Даунер
источник
1
«Вам не нужно ничего настраивать», но мой сертификат недавно истек, и я установил certbot около 3 месяцев назад. /etc/cron.d/certbotсуществует, systemctl list-timersпоказывает certbot.timer, но мои сертификаты не были обновлены. Запуск certbotвручную работал нормально, поэтому я не знаю, что происходит. Закончилось добавлением старой школьной crontabзаписи.
Дан Даскалеску
Это самый актуальный и правильный ответ, но с оговоркой, что это зависит от того, какой дистрибутив вы используете: certbot.eff.org/docs/using.html#id8
olive_tree
msgstr "и задание cron будет запущено, только если systemd не активен". Можете ли вы помочь найти какой-нибудь документ об этом "приоритете", объяснил, пожалуйста?
Тит
@titus объяснение состоит в том, что задание cron сначала запускает a, testчтобы проверить, активен ли systemd, и если это так, задание cron немедленно завершается без выполнения certbot- см. текст о задании cron. Я отредактирую текст, чтобы быть более точным.
Хэмиш Даунер
5

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

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

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

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

shodanshok
источник
3

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

Примечание: если вы настраиваете работу 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

Tadej
источник
1
«Пожалуйста, выберите случайную минуту в течение часа для ваших задач обновления».
Исиус
1
Согласно моей заметке выше, вам будет лучше --renew-hook, когда сервер перезагружается только тогда, когда сертификат действительно обновляется.
Что можно было
@Isius спасибо, я изменил его на случайную минуту (6).
Тадей
1
@JedatKinports: Не следует ли --post-hookи --renew-hookбыть service apache2 restartвместо service restart apache2?
Пол Ратацци
1
Команда перезапускает службу apache2 ! service restart apache2Не правильная команда / сервис.
Г.Т.Доров
1

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

/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

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

Начиная с версии certbot --renew-hookфлаг 0.21.1 изменен на --deploy-hook Убедитесь, что вы не используете устаревший флаг.

certbot renew --deploy-hook "systemctl restart myservice"
Shinebayar G
источник
0

Согласно руководству по сертификату EFF

Многие дистрибутивы Linux обеспечивают автоматическое обновление, когда вы используете пакеты, установленные через их менеджер системных пакетов.

Если вы не уверены, имеет ли ваша система это уже автоматизированное, проверьте crontab вашей системы (как правило, в /etc/crontab/и /etc/cron.*/* $ crontab -lи системные таймеры $ systemctl list-timers .

Suhayb
источник