Let's Encrypt выдаёт сертификаты на девяносто дней и продлевает их автоматически, поэтому про них перестают думать через неделю после настройки. Проблема в том, что автопродление ломается тихо: ошибок никто не видит, а через три месяца сайт встречает посетителей предупреждением браузера. С 2025 года Let's Encrypt прекратил рассылку писем об истечении срока, так что последнее внешнее напоминание тоже исчезло.

Ниже — причины, по которым продление перестаёт работать, в порядке убывания частоты.

1. Сертификат продлён, но служба его не перечитала

Самая частая. certbot renew отработал, новый файл лежит на диске, а nginx или Apache продолжают держать в памяти старый — и отдают его посетителям до перезагрузки конфигурации. Формально всё в порядке, фактически сайт с истёкшим сертификатом.

Лечится хуком, который выполняется после успешного продления:

sudo certbot renew --deploy-hook "systemctl reload nginx"

Записывается это один раз в файл продления (/etc/letsencrypt/renewal/example.com.conf, секция [renewalparams], строка renew_hook) и дальше работает само.

2. Изменился веб-сервер, а проверка осталась прежней

Проверка HTTP-01 требует, чтобы файл из каталога /.well-known/acme-challenge/ отдавался по обычному HTTP. Ломают её обычно так:

  • в конфиг добавили безусловный редирект с HTTP на HTTPS — проверка уходит в редирект и не проходит;
  • появилось правило location ~ /\. с deny all, закрывающее все каталоги с точкой, включая .well-known;
  • сменился корень сайта, а в настройках certbot остался прежний путь --webroot-path;
  • включилась блокировка по странам или базовая авторизация, под которую попал и сервер проверки.

Правильный порядок в конфиге: сначала отдельный location для /.well-known/acme-challenge/, и только потом общий редирект.

3. Таймер отключён

Продление запускается таймером systemd или заданием cron, и то и другое можно случайно отключить при отладке или потерять при переносе сервера.

systemctl list-timers | grep certbot
sudo certbot renew --dry-run

Вторая команда выполняет полный цикл продления в тестовом режиме, не расходуя лимиты. Это единственная проверка, которая отвечает на вопрос «продлится ли оно через месяц» заранее, а не постфактум.

4. Домен больше не указывает сюда

Сертификат выписан на пять доменов, один из них переехал на другой хостинг, DNS изменился. Проверка по этому домену перестаёт проходить, и certbot не продлевает весь сертификат целиком — вместе с четырьмя рабочими доменами. Лишние домены надо убирать из сертификата, а не игнорировать сообщение.

5. Упёрлись в лимиты

Let's Encrypt ограничивает число сертификатов на домен за неделю. Обычно это следствие цикла «не получилось — попробую ещё раз» при отладке. Для экспериментов существует тестовый сервер (--dry-run или --test-cert), и пользоваться им нужно до того, как лимит исчерпан, а не после.

Проверять надо то, что отдаётся

Все проверки по файлам на диске имеют один изъян: файл может быть свежим, а посетитель при этом получать старый сертификат. Смотреть надо со стороны клиента:

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -dates -subject -issuer

Опция -servername обязательна: без неё на сервере с несколькими сайтами вы получите сертификат первого попавшегося виртуального хоста, а не нужного. В выводе notAfter — это и есть настоящая дата истечения.

Заодно стоит проверить цепочку:

echo | openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null | grep -c 'BEGIN CERTIFICATE'

Если сертификат один, промежуточный не отдаётся. Браузеры такую конфигурацию обычно прощают — они достраивают цепочку сами, — а вот curl, мобильные приложения и клиенты на Java выдадут ошибку проверки. Это классический случай «у меня всё открывается, а у клиентов не работает».

За сколько дней предупреждать

Тридцать дней — разумный порог для первого сигнала: столько же остаётся до истечения в момент, когда certbot начинает попытки продления, и если к этому моменту ничего не произошло, значит, механизм сломан. Четырнадцать дней — второй сигнал, уже требующий действий сегодня. Семь — аварийный.

Важно, что следить надо за всеми сертификатами сразу, включая те, что не от Let's Encrypt: купленные на год забываются надёжнее всего, потому что за год все успевают забыть и про них, и про то, на чью почту приходят уведомления. Одна страница со списком доменов, датами и остатком дней закрывает вопрос целиком — как на демо ниже.