Это правильный способ установить cron для обновления сертификата Let's Encrypt в Apache2? Я использую Ubuntu 16.04.
@monthly letsencrypt renew && service apache2 reload
Это правильный способ установить cron для обновления сертификата Let's Encrypt в Apache2? Я использую Ubuntu 16.04.
@monthly letsencrypt renew && service apache2 reload
Ответы:
Ежемесячно не достаточно часто. Этот скрипт должен запускаться как минимум еженедельно, а желательно ежедневно. Помните, что сертификаты не будут обновлены, если они не близки к истечению срока действия, и ежемесячные действия могут привести к тому, что срок действия ваших существующих сертификатов будет истекать до того, как они будут обновлены.
Название программы 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 не исправит это.
--renew-hook
вместо того --post-hook
, чтобы только перезапустить , если сертификат успешно продлен.
certbot renew
просто будет работать ™
ExecStartPost=/usr/sbin/service nginx reload
. Работал на меня!
ExecStartPost=
- хорошая идея. Почему я не подумал об этом? Но имейте в виду, что service
команда устарела; это не будет вечно. Переключитесь на соответствующие systemctl
команды.
У меня недостаточно репутации, чтобы комментировать, поэтому я отвечу здесь. Недавно (октябрь 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.
certbot renew
если /run/systemd/system
оно присутствует - это потому, что вместо этого системный таймер выполняет certbot - узнайте больше о certbot и системных таймерах здесь .
43 6 * * *
заставил бы это бежать каждый день в 6:43. Один раз в день должно быть достаточно, но любой из них работает нормально.
Документация 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'
--renew-hook
чтобы перезапустить только после успешного обновления: guyrutenberg.com/2017/01/01/…
Вам не нужно ничего настраивать. Любая недавняя установка 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
это не является каталогом. Переходите к следующему биту только в случае успешной проверки.
perl -e 'sleep int(rand(43200))'
- спать случайное количество от 0 секунд до 12 часов (43200 = 12 х 60 х 60).certbot -q renew
проверьте свои сертификаты и обновите, если требуется. -q
Флаг «тихий» - не производят никакого вывода , если нет ошибки.Первоначально я был озадачен работой cron, так как она не запускалась из-за systemd, так как же будет запускаться certbot? Я нашел ответ в этом сообщении на форуме, на котором я основал этот ответ.
/etc/cron.d/certbot
существует, systemctl list-timers
показывает certbot.timer
, но мои сертификаты не были обновлены. Запуск certbot
вручную работал нормально, поэтому я не знаю, что происходит. Закончилось добавлением старой школьной crontab
записи.
test
чтобы проверить, активен ли systemd, и если это так, задание cron немедленно завершается без выполнения certbot
- см. текст о задании cron. Я отредактирую текст, чтобы быть более точным.
Для продления сертификата LetsEncrypt я обычно использую getssl . Это очень удобная оболочка, которая может даже устанавливать сертификат на другие машины через SSH-соединение.
Запись cron следующая:
01 23 * * * root /root/scripts/getssl/getssl -u -a -q >>/var/log/getssl.log 2>&1 ; /usr/sbin/apache2ctl graceful
Как уже предлагалось, вы должны запускать его ежедневно или, что еще лучше, два раза в день.
Как уже упоминалось глау:
Примечание: если вы настраиваете работу 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
--renew-hook
, когда сервер перезагружается только тогда, когда сертификат действительно обновляется.
--post-hook
и --renew-hook
быть service apache2 restart
вместо service restart apache2
?
service restart apache2
Не правильная команда / сервис.
Это то, что я использую:
/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
Другие участники уже предоставили намного более подробные ответы. Но, похоже, я должен упомянуть об этом здесь.
Начиная с версии certbot --renew-hook
флаг 0.21.1 изменен на --deploy-hook
Убедитесь, что вы не используете устаревший флаг.
certbot renew --deploy-hook "systemctl restart myservice"
Согласно руководству по сертификату EFF
Многие дистрибутивы Linux обеспечивают автоматическое обновление, когда вы используете пакеты, установленные через их менеджер системных пакетов.
Если вы не уверены, имеет ли ваша система это уже автоматизированное, проверьте crontab вашей системы (как правило, в /etc/crontab/
и /etc/cron.*/*
$ crontab -l
и системные таймеры $ systemctl list-timers
.
/etc/cron.d/certbot