Что было. Сайт на Ubuntu 22.04 с Apache перестал открываться по HTTPS: сертификат истёк. Администратор был уверен, что продлевал его, потому что регулярно запускал certbot renew --dry-run и видел «Congratulations, all simulated renewals succeeded». Вопрос: почему не продлилось и как настроить автоматику.
Почему. --dry-run только симулирует продление через тестовую среду центра сертификации, ничего не записывая. Это проверка, что продление сработает, а не само продление. Реальная команда certbot renew без флага. Участники также объяснили, как работает автопродление в пакете Ubuntu, и попросили не добавлять свой cron поверх.
Как устроено автопродление на Ubuntu/Debian.
- Пакет ставит systemd-таймер
certbot.timer, который дважды в сутки запускаетcertbot -q renew. Продление реально выполняется только для сертификатов, до истечения которых меньше 30 дней; остальные пропускаются. - Файл
/etc/cron.d/certbotтоже есть, но с условием «выполнять только если systemd не запущен», поэтому на обычной системе он не срабатывает. - Для certbot из snap таймер называется
snap.certbot.renew.timer. - Проверка:
systemctl list-timers | grep certbotиjournalctl -u certbot.service(последний запуск и результат).
Почему автопродление всё же может не сработать.
- Изменилась схема проверки: сайт переехал за CDN, сменился порт 80 на брандмауэре, изменился webroot. Симуляция покажет это заранее, поэтому
--dry-runполезен, но не вместо продления. - Веб-сервер не перечитал новый сертификат. Продление кладёт файлы в
/etc/letsencrypt/live/домен/, но Apache/nginx держат старый в памяти доreload. Плагины--apache/--nginxделают это сами; приwebrootнужен--deploy-hook "systemctl reload nginx"в конфиге продления (/etc/letsencrypt/renewal/домен.conf). - Домен исключён из сертификата: сообщение «не входит в сертификат» означает, что новое имя (например,
forum.поддомен) не было добавлено.certbot --expand -d старые -d новые. - Таймер отключён или certbot удалён при переустановке пакетов:
systemctl is-enabled certbot.timer.
Быстрая проверка состояния. certbot certificates показывает все сертификаты и дни до истечения; внешне echo | openssl s_client -connect домен:443 -servername домен 2>/dev/null | openssl x509 -noout -dates показывает, что реально отдаёт сервер.
Мониторинг. Один внешний проверяльщик с оповещением за 14 дней до истечения дешевле любого разбора «почему упало».
Автопродление описано в документации certbot.