Браузер показывает предупреждение о сертификате, а панель хостинга уверяет, что продление прошло. Не начинайте с повторного выпуска. Сначала узнайте, какой сертификат реально отдаёт публичный endpoint. Между файлом на диске и браузером могут стоять Nginx, балансировщик или CDN.
Снимите сертификат с правильным SNI
DOMAIN=example.ru
echo | openssl s_client -connect example.ru:443 -servername example.ru -showcerts 2>/dev/null \
| openssl x509 -noout -subject -issuer -serial -dates
curl -Iv https://example.ru/Параметр -servername передаёт имя через SNI. Без него сервер с несколькими virtual host может вернуть чужой сертификат. Проверять только IP здесь недостаточно.
Читайте результат по слоям
| Признак | Причина | Следующий шаг |
|---|---|---|
| notAfter в прошлом | Сертификат истёк | Проверить renewal |
| subject другого домена | SNI или default vhost | Проверить server_name |
| Файл новый, снаружи старый | Нет reload или TLS на прокси | Найти точку TLS |
| unable to get local issuer | Неполная цепочка | Проверить fullchain |
PASS: subject покрывает домен, notAfter в будущем, а curl -Iv завершает TLS без ошибки. FAIL: локальный файл новый, но внешняя команда показывает другой serial.
Сверьте конфигурацию
sudo nginx -t
sudo nginx -T 2>/dev/null | grep -E 'server_name|ssl_certificate(_key)?'
sudo certbot renew --dry-runnginx -T выводит пути конфигурации. Не публикуйте приватный ключ. После обновления проверьте reload Nginx. Новый файл сам по себе не меняет сертификат в работающем процессе.
Алгоритм восстановления
- Сохраните внешний serial, даты и issuer.
- Определите точку TLS: Nginx, CDN или балансировщик.
- Сверьте активный путь с обновлённым файлом.
- Запустите dry-run renewal и прочитайте ошибку.
- Проверьте конфигурацию веб-сервера.
- Выполните штатный reload.
- Повторите внешние openssl и curl.
Частые ошибки
Проверяют без SNI. Получают сертификат default vhost.
Подменяют только leaf. Браузеру не хватает промежуточного сертификата.
Забывают CDN. На origin всё свежее, а публичный TLS завершается раньше.
Перезапускают всё. До фиксации serial теряется доказательство.
Чек-лист
- Домен проверен с SNI.
- Даты и serial сохранены.
- Hostname совпадает.
- Цепочка проходит проверку.
- Точка TLS найдена.
- Renewal dry-run успешен.
- После reload serial изменился.
Проверьте, кто действительно завершает TLS
DNS домена может указывать на CDN, облачный балансировщик или отдельный reverse proxy. В этом случае сертификат на origin вообще не виден посетителю. Сравните адрес из DNS с архитектурой, затем выполните внешний тест из другой сети. Локальный hosts-файл или корпоративный прокси легко дают другой результат.
Если сервер отдаёт несколько доменов, найдите соответствующий блок server_name и путь ssl_certificate. Сравните serial файла на диске с внешним serial. Совпадение доказывает, что reload подхватил нужный файл; несовпадение указывает на другой процесс, контейнер, proxy или старую конфигурацию.
Проверка автоматического продления
certbot renew --dry-run проверяет сценарий, но успех команды ещё не гарантирует, что production использует полученный файл. После dry-run проверьте timer или cron, hook перезагрузки и права процесса на каталог сертификата. Для container deployment убедитесь, что volume смонтирован в тот контейнер, который завершает TLS.
Проверяйте минимум основной домен и вариант с www, если он обслуживается. Одна запись может иметь свежий сертификат, другая попадать в default vhost. Для wildcard отдельно контролируйте DNS challenge и доступ к учётным данным провайдера, не выводя их в журнал.
Контроль после восстановления
Проверьте сертификат не только в браузере администратора. Запустите внешний запрос из сети без корпоративного proxy, затем откройте домен на мобильной сети. Сравните serial. Если значения разные, трафик приходит на несколько узлов, и часть из них всё ещё отдаёт старый сертификат.
Для балансировщика повторите проверку несколько раз или обращайтесь к каждому backend по согласованному диагностическому адресу с правильным SNI. Не отключайте проверку hostname. Цель — найти конкретный узел, а не получить зелёный ответ любой ценой.
После исправления поставьте мониторинг срока, который проверяет публичный endpoint, а не файл на диске. Предупреждение должно приходить заранее и содержать домен, notAfter и serial. Отдельный alert нужен на ошибку renewal job. Тогда следующий сбой станет задачей до истечения, а не сообщением клиента.
Контрольная точка закрыта, когда внешний монитор, браузер и OpenSSL видят один serial и срок, а renewal dry-run проходит без ошибки. Сохраните дату следующего предупреждения и владельца домена. Проверка одного зелёного браузера недостаточна для завершения инцидента.
После изменения не удаляйте старый сертификат сразу. Убедитесь, что все узлы получили новый файл и reload прошёл. Затем уберите временные диагностические правила и проверьте, что HTTP перенаправляется на HTTPS без лишней цепочки редиректов.
Повторите проверку утром следующего дня: кеш DNS, CDN и долго живущие процессы иногда скрывают неполное переключение.
Что делать, если не помогло
Не добавляйте клиентам флаг отключения проверки. Снимите вывод s_client без приватных данных, DNS-адреса и активные пути. После восстановления выполните приёмочный чек-лист сайта и проверьте canonical после релиза. CTR1 может проверить сайт и production-контур до потери заявок.



