Завдання Cron - давайте шифруємо оновлення


93

Це правильний спосіб встановити cron для оновлення cert шифрувати cert в Apache2? Я використовую Ubuntu 16.04.

@monthly letsencrypt renew && service apache2 reload

6
Як говориться в одній з відповідей нижче, certbot v0.19.0 (а може бути, і раніше) вже створив запис на /etc/cron.d/certbot
кронтах

Також плагін certbot apache з валідацією tls-sni перезавантажить apache як частину процедури перевірки після отримання нового сертифіката.
xgMz

Нижче є відповідь, що дуже важливо для нових встановлень (станом на JAN 2019). Certbot автоматично додає системний таймер та графік роботи cron, тому налаштування крона з вашого боку не потрібна.
Кори Робінсон

Відповіді:


145

Щомісяця недостатньо часто. Цей сценарій повинен працювати щонайменше щотижня, а краще щодня. Пам’ятайте, що серти не оновлюються, якщо вони не закінчуються, а щомісяця може призвести до того, що періодично закінчується термін дії ваших існуючих сертифікатів вже до їх поновлення.

Назва програми - це certbot, з якої було перейменовано letsencrypt. Якщо ви все ще використовуєте letsencrypt, вам потрібно оновити до поточної версії.

Окрім цих питань, це приблизно те саме, що і у моїх робочих місцях.

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
Яке часове вікно "майже до закінчення терміну дії"?
Andre Figueiredo

3
Користувачеві --renew-hookзамість цього може бути краще --post-hook, щоб він перезапустився лише у випадку успішного оновлення cert.
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

Було б непогано перевірити, чи цей файл вже існує, перш ніж створювати запис на кроні.


1
Я бачив, що я мав це і після запуску certbot. Дуже приємно, що дозволяє шифрувати це! Це чудовий проект.
Бьорн

7
Варто усвідомлювати, що вищезазначене завдання cron не буде виконуватися, certbot renewякщо /run/systemd/systemвоно є - це тому, що замість того, щоб системний таймер працює certbot - читайте більше про certbot та системні таймери тут .
Гаміш Даунер

Дякуємо, що згадали, що кронштейн уже встановлений. Я не знав цього, поки не прочитав твій пост.
NilsB

1
Для всіх, хто цікавиться, це змушує працювати кожні 12 годин. Інша відповідь 43 6 * * *змусить його працювати щодня о 6:43 ранку. Раз на день має бути достатньо, але або один працює добре.
orrd

42

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

Примітка:

якщо ви налаштовуєте роботу із системою cron або systemd, радимо запускати її двічі на день (вона нічого не зробить, поки ваші сертифікати не будуть відновлені або відкликані, але запуск її регулярно надасть вашому сайту можливість залишатися в Інтернеті у випадку скасування давальницького шифрування відбулося з якихось причин). Будь ласка, виберіть випадкову хвилину протягом години для ваших завдань із поновлення.

Як згадує Майкл Хемптон, ім'я змінилося на certbot, але вони все ще надають опцію -auto, яка постійно оновлюється. certbot-autoКоманді потрібна кореневі привілейованості працювати, так як у вашому Хроні сценарії повинні виглядати наступним чином :

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'

1
Мені подобається, як це пояснюється, детальний перезапуск сервісу не потрібен (це може заплутати, якщо хтось щось робить на цьому, маючи шанс двічі на день потрапити) і згадати про необхідні привілеї.
Густавв Гіл,

4
Це не вірно - це є необхідним , щоб перезавантажити сервер, по крайней мере , з Nginx - Nginx з'являється кешувати початковий сертифікат і не зареєструвати новий сертифікат , навіть якщо зміни файлу. Дивіться цю публікацію, щоб отримати інформацію про використання --renew-hookлише для повторного запуску після успішного поновлення: guyrutenberg.com/2017/01/01/…
могло

17

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

робота з крон

Як уже згадували інші, є також завдання, що встановлюється в /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? У цій публікації на форумі я знайшов відповідь, на чому я грунтувався на цій відповіді.


1
"Вам нічого не потрібно було встановлювати", але нещодавно мій термін закінчився, і я встановив certbot близько 3 місяців тому. /etc/cron.d/certbotіснує, systemctl list-timersпоказує certbot.timer, але мої серти не були відновлені. Біг certbotвручну працював чудово, тому я не знаю, що відбувається. Закінчила додавання запису до старої школи crontab.
Дан Даскалеску

Це найсучасніша і правильна відповідь, але з застереженням, що це залежить від того, з чим ви працюєте: certbot.eff.org/docs/using.html#id8
olive_tree

"і завдання cron буде виконуватись лише якщо systemd не активний". Чи можете ви допомогти у пошуку якогось документа про цей "пріоритет", пояснений будь ласка?
тит

@titus пояснення полягає в тому, що завдання cron спочатку запускає a, testщоб перевірити, чи systemd активний, і якщо він є, завдання cron негайно закінчується без запуску certbot- дивіться текст про завдання cron. Я відредагую текст, щоб бути більш точним.
Хаміш Даунер

5

Для відновлення сертифікату LetsEncrypt я зазвичай використовую getssl . Це дуже зручна оболонка, яка навіть може встановити сертифікат на інші машини через SSH-з'єднання.

Запис крона такий:

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

Як уже було запропоновано, слід запускати його щодня або, ще краще, двічі на день.


3

Як вже згадував glaux:

Примітка: якщо ви налаштовуєте роботу з хроном або системою, радимо запускати її двічі на день (вона не буде робити нічого, поки ваші сертифікати не будуть відновлені або відкликані, але запуск її регулярно дасть можливість вашому сайту залишитися в Інтернеті, якщо скасування "Давайте зашифруємо" відбудеться з якихось причин). Будь ласка, виберіть випадкову хвилину протягом години для ваших завдань із поновлення.

Джерело: 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"

- гачки попереднього підключення та - гачки для поштового зв'язку запускаються до та після кожної спроби відновлення. Якщо ви хочете, щоб ваш гак запускався лише після успішного оновлення, використовуйте --renew-hock у такій команді.

Джерело: https://certbot.eff.org/docs/using.html


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)

І його приказка, що апаш вже перезапущений, тому не потрібно робити це заново. Якщо я запускаю його ще раз:

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 версії 0.21.1 змінено --renew-hookпрапор --deploy-hook Переконайтесь, що ви не використовуєте застарілий прапор.

certbot renew --deploy-hook "systemctl restart myservice"

0

Згідно з посібником з certbot EFF

Багато дистрибутивів Linux забезпечують автоматичне оновлення під час використання пакетів, встановлених через їх системний менеджер пакетів.

Якщо ви не впевнені , є ваша система це вже автоматизована, перевірте вашу систему кронтаб ( як правило , в /etc/crontab/і /etc/cron.*/* $ crontab -lі Systemd таймерів $ systemctl list-timers .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.