Сертификат истёк, хотя «продление запускали»: разница между certbot renew и --dry-run и как устроено автопродление на Ubuntu

Что было. Сайт на 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 (последний запуск и результат).

Почему автопродление всё же может не сработать.

  1. Изменилась схема проверки: сайт переехал за CDN, сменился порт 80 на брандмауэре, изменился webroot. Симуляция покажет это заранее, поэтому --dry-run полезен, но не вместо продления.
  2. Веб-сервер не перечитал новый сертификат. Продление кладёт файлы в /etc/letsencrypt/live/домен/, но Apache/nginx держат старый в памяти до reload. Плагины --apache/--nginx делают это сами; при webroot нужен --deploy-hook "systemctl reload nginx" в конфиге продления (/etc/letsencrypt/renewal/домен.conf).
  3. Домен исключён из сертификата: сообщение «не входит в сертификат» означает, что новое имя (например, forum. поддомен) не было добавлено. certbot --expand -d старые -d новые.
  4. Таймер отключён или certbot удалён при переустановке пакетов: systemctl is-enabled certbot.timer.

Быстрая проверка состояния. certbot certificates показывает все сертификаты и дни до истечения; внешне echo | openssl s_client -connect домен:443 -servername домен 2>/dev/null | openssl x509 -noout -dates показывает, что реально отдаёт сервер.

Мониторинг. Один внешний проверяльщик с оповещением за 14 дней до истечения дешевле любого разбора «почему упало».

Автопродление описано в документации certbot.