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: купленные на год забываются надёжнее всего, потому что за год все успевают забыть и про них, и про то, на чью почту приходят уведомления. Одна страница со списком доменов, датами и остатком дней закрывает вопрос целиком — как на демо ниже.