Безопасность сайта

Сертификат SSL истёк: что делать в первые двадцать минут

Сайт закрыт предупреждением браузера из-за просроченного сертификата. Как быстро выпустить новый, починить автопродление и не поймать это снова.

12 минут чтения 6 Дмитрий Акиндинов
Содержание
  1. Что реально теряется, пока висит предупреждение
  2. Двадцать минут по шагам
  3. Диагностика: одна команда вместо десяти кликов
  4. Выпуск нового: три пути
  5. Почему автопродление сломалось молча
  6. Грабли с www и поддоменами
  7. Проверка после починки
  8. Как узнавать за две недели, а не от клиента
  9. Кто за этим следит и сколько стоит
  10. Частые вопросы

Пока висит красный экран, через него по данным счётчиков проходит от 2 до 6 процентов посетителей, остальные уходят. Первые двадцать минут уходят на диагностику и перевыпуск: панель хостинга делает это за минуту-пятнадцать, консольная утилита за 5-20 минут.

В пятницу вечером у клиента перестали приходить заявки. Сайт при этом работал: отдавал страницы, база живая, хостинг на месте. Просто каждый посетитель сначала упирался в красный экран браузера. Сертификат SSL истёк накануне ночью, автопродление сломалось ещё в мае, и об этом никто не знал, потому что никто не смотрел. Ниже порядок действий на первые двадцать минут, команды для диагностики, три способа выпустить новый сертификат и разбор причин, по которым certbot молча перестаёт работать.

Просроченный сертификат сайта и календарь с отмеченной датой

Я веду абонентку шесть лет, и просроченный сертификат стабильно входит в тройку самых обидных аварий. Обидных потому, что чинится за пятнадцать минут, предотвращается бесплатно, а стоит бизнесу как полноценное падение сайта.

Что реально теряется, пока висит предупреждение

Владельцы часто недооценивают масштаб. Кажется, что это косметическая ерунда: ну ругается браузер, ну нажмут «перейти всё равно». Не нажмут.

Chrome показывает полноэкранную заглушку с текстом про недействительный сертификат и кодом NET::ERR_CERT_DATE_INVALID. Кнопка «Дополнительно» спрятана, за ней ещё одна ссылка мелким шрифтом. Firefox выдаёт SEC_ERROR_EXPIRED_CERTIFICATE, Safari на iPhone просто отказывается идти дальше без внятного объяснения. По моим замерам на клиентских Метриках, через такой экран проходит от 2 до 6 процентов посетителей. Остальные закрывают вкладку.

Дальше по цепочке ломается всё, что ходит на сайт программно:

  • вебхуки платёжного шлюза перестают доходить, потому что сервер банка проверяет сертификат строго и никакого «перейти всё равно» у него нет;
  • обмен с 1С отваливается с ошибкой TLS handshake;
  • Яндекс Директ и рекламные кабинеты при плановой перепроверке отправляют объявления на модерацию, а деньги в это время продолжают списываться за клики по объявлениям, ведущим на заглушку;
  • Метрика не получает хиты, и в отчётах образуется дыра, из-за которой потом две недели непонятно, что происходило с трафиком;
  • почтовые рассылки со ссылками на сайт превращаются в аттракцион с предупреждениями.

Отдельно про поиск. Робот Яндекса при обходе получает ошибку соединения и в Вебмастере появляется рост исключённых страниц. За сутки-двое ничего катастрофического не случится, но неделя такого состояния уже двигает позиции вниз.

И самое неприятное: примерно половина посетителей после красного экрана делает вывод, что сайт взломан. Это другая история, у неё другие причины и другой ремонт, я разбирал её в статье про то, что делать, когда браузер пишет «опасный сайт». Путают их постоянно, потому что оба экрана красные.

Двадцать минут по шагам

Порядок важнее скорости. Я видел, как в панике переустанавливают nginx на боевом сервере, хотя надо было нажать одну кнопку в панели хостинга.

МинутыЧто делаетеЧем проверяете
0-2Подтверждаете диагноз, отличаете просрочку от блокировки и зараженияКод ошибки в браузере, инкогнито, мобильный интернет
2-6Смотрите даты, издателя и список доменов в сертификатеopenssl s_client из консоли или онлайн-чекер
6-8Определяете, кто вообще выпускает сертификат на этом проектеПанель хостинга, наличие certbot, письма от УЦ
8-16Выпускаете новый сертификат и перезагружаете веб-серверПанель или certbot, затем nginx -s reload
16-20Проверяете результат и добиваете хвостыcurl с заголовками, инкогнито, формы, оплата

Пункт 0-2 пропускать нельзя. Раз в несколько месяцев ко мне приходят с «истёк сертификат», а по факту домен не оплачен, DNS уехал, и браузер ругается совсем на другое.

Диагностика: одна команда вместо десяти кликов

Открывать замочек в адресной строке можно, но браузер кэширует сертификат в рамках сессии и после починки будет какое-то время показывать старый. Смотреть надо с сервера или из терминала.

echo | openssl s_client -connect saitfix.ru:443 -servername saitfix.ru 2>/dev/null 
  | openssl x509 -noout -subject -issuer -dates -ext subjectAltName

Ответ выглядит так:

subject=CN = saitfix.ru
issuer=C = US, O = Let's Encrypt, CN = R11
notBefore=May 18 09:14:03 2026 GMT
notAfter=Aug 16 09:14:02 2026 GMT
X509v3 Subject Alternative Name:
    DNS:saitfix.ru, DNS:www.saitfix.ru

Четыре строки, четыре ответа. notAfter в прошлом означает просрочку. issuer говорит, кто выпускал: если там Let’s Encrypt, автопродление в принципе существовало и просто сломалось. subjectAltName показывает, на какие домены выписан сертификат, и вот здесь чаще всего вылезает сюрприз с www.

Если под рукой нет консоли, короткий вариант через curl:

curl -svo /dev/null https://saitfix.ru 2>&1 | grep -E "expire date|subject:|issuer:"

Онлайн-чекеры типа SSL Labs или проверялки на сайтах регистраторов тоже годятся, но они лезут снаружи и не покажут, что именно лежит на диске сервера. Когда сертификат уже перевыпущен, а браузер всё ещё ругается, разница между «что на диске» и «что отдаётся» становится ключевой.

Типовые расшифровки:

Код в браузереЧто на самом деле
ERR_CERT_DATE_INVALIDСрок вышел. Либо сертификат старый, либо часы на сервере уехали
ERR_CERT_COMMON_NAME_INVALIDСертификат живой, но выписан на другой домен или только на www
ERR_CERT_AUTHORITY_INVALIDСамоподписанный сертификат или неполная цепочка без промежуточного
ERR_SSL_PROTOCOL_ERRORСертификат не отдаётся вообще, порт 443 не слушается или конфиг битый
ERR_TOO_MANY_REDIRECTSСертификат ни при чём, петля в редиректах http и https

Выпуск нового: три пути

Через панель хостинга

Быстрее всего. Timeweb, Beget, REG.RU, Спринтхост, Джино: у всех в разделе домена есть пункт SSL и кнопка выпуска бесплатного сертификата. Хостинг сам поднимает проверку, кладёт файл в .well-known, забирает сертификат и прописывает его в конфиг. Занимает от одной до пятнадцати минут, стоит ноль рублей.

Единственное, что надо сделать руками: убедиться, что в списке доменов галочками отмечены и голый домен, и www. Панели по умолчанию отмечают то, что вы открыли, а не всё сразу.

Если хостинг предлагает «заказать SSL за 1 900 рублей в год» и прячет бесплатный вариант в другом разделе, это не значит, что бесплатного нет. Разбор того, где искать и чем варианты отличаются, есть в статье про бесплатный SSL в 2026 году.

Через certbot на VPS

Если сервер свой, начинать надо не с выпуска, а с вопроса, что там уже настроено:

certbot certificates
certbot renew --dry-run

Первая команда покажет все сертификаты, которые certbot считает своими, с датами и списком доменов. Вторая прогонит продление вхолостую и выведет реальную ошибку. Именно --dry-run обычно и отвечает на вопрос «почему оно само не обновилось»: в выводе будет либо 404 на challenge-файле, либо таймаут, либо отлуп по rate limit.

Когда причина понятна и устранена:

certbot renew --force-renewal
systemctl reload nginx

Если сертификата в списке нет вообще (сервер переставляли, панель сносили, конфиг переписывали), выпускаем с нуля через webroot, не останавливая веб-сервер:

certbot certonly --webroot 
  -w /var/www/saitfix.ru/public_html 
  -d saitfix.ru -d www.saitfix.ru 
  --agree-tos -m admin@saitfix.ru --non-interactive

Путь в -w должен быть тем самым каталогом, куда смотрит сайт. Ошибка на этом месте даёт 404 при проверке и невнятную жалобу certbot на недоступность challenge.

Платный сертификат

Нужен в трёх ситуациях: хостинг не умеет Let’s Encrypt и не даёт консоль; требуется wildcard на пачку поддоменов без возни с DNS-валидацией; заказчик по внутренним правилам требует OV или EV с проверкой юрлица.

Ориентиры по деньгам на 2026 год: DV-сертификат от 800 до 2 500 рублей в год, wildcard от 4 000 до 9 000, OV от 6 000. Выпуск DV занимает от десяти минут до часа, OV с проверкой документов до трёх рабочих дней. То есть на аварии платный сертификат вас не спасёт, если только у вас нет купленного заранее.

СпособВремя до рабочего сайтаДеньгиКогда выбирать
Панель хостинга1-15 минут0Shared-хостинг, обычный сайт услуг
certbot на сервере5-20 минут0VPS, есть root, нужен контроль
Платный DV10-60 минут800-2 500 в годХостинг без поддержки Let’s Encrypt
Платный wildcard20-90 минутот 4 000 в годМного поддоменов, нет доступа к DNS API

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

Самая частая жалоба звучит так: «у нас же стоял автовыпуск, он год работал». Он и правда работал. Потом что-то изменилось, и попытки продления начали падать, а сообщать о падении было некому.

Отдельно отмечу: Let’s Encrypt с июня 2025 года перестал рассылать письма об истечении срока. Раньше за 20, 10 и 1 день до конца приходило письмо, и это была народная система мониторинга. Теперь её нет. Если вы привыкли, что «нас предупредят», то не предупредят.

Шесть причин, которые я вижу в работе чаще остальных.

Закрыт путь к проверке. Правило в .htaccess или в конфиге nginx редиректит вообще всё на главную или на https, включая /.well-known/acme-challenge/. Удостоверяющий центр стучится за файлом и получает 301 или 403. Проверяется за полминуты:

mkdir -p /var/www/saitfix.ru/public_html/.well-known/acme-challenge
echo ok > /var/www/saitfix.ru/public_html/.well-known/acme-challenge/test.txt
curl -sI http://saitfix.ru/.well-known/acme-challenge/test.txt | head -1

Ждём HTTP/1.1 200 OK. Всё остальное означает, что путь перекрыт. Лечится исключением, которое стоит выше редиректов:

RewriteEngine On
RewriteRule ^.well-known/acme-challenge/ - [L]

RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Порядок правил здесь решает всё: первое совпадение прекращает обработку.

Сайт переехал, а certbot остался. Классика после смены хостинга. A-запись домена смотрит на новый сервер, проверка уходит туда, а cron с certbot продолжает крутиться на старом и получать 404. Симптом: в логах старого сервера бодрые сообщения о попытках, на новом никаких сертификатов. Порядок нормального переезда со всеми хвостами я расписывал в материале про перенос сайта на новый хостинг.

Задание в кроне исчезло. Systemd-таймер certbot.timer выключен, или crontab пользователя затёрли при переустановке панели. Проверка:

systemctl list-timers | grep certbot
crontab -l | grep -i certbot

Бот удостоверяющего центра забанен. Плагин безопасности, фаервол хостинга или правило в htaccess режет запросы по user-agent либо по географии. Let’s Encrypt валидирует с нескольких точек мира, и достаточно, чтобы одна из них не прошла. В access-логе такие попытки видно по строкам с acme-challenge и кодом 403.

Упёрлись в лимиты. У Let’s Encrypt пять неудачных валидаций в час на домен и пятьдесят сертификатов на зарегистрированный домен в неделю. Если админ в панике перевыпускал в цикле, следующая попытка получит отлуп на несколько часов. Тут помогает только пауза, поэтому паниковать невыгодно.

Сертификат выпустился, но не подключился. Файлы на диске свежие, а nginx или apache держит в памяти старые и не был перезагружен. Даты в браузере при этом старые, и человек ходит по кругу, перевыпуская снова. Проверять надо тем же openssl s_client, он показывает то, что реально отдаётся в порт.

Грабли с www и поддоменами

Отдельный сюжет, который стоит нервов больше всех остальных вместе взятых.

Сертификат выписан на saitfix.ru, а посетитель заходит на www.saitfix.ru. Домен в сертификате не совпадает, браузер выдаёт ERR_CERT_COMMON_NAME_INVALID, и владелец искренне не понимает, почему «у меня открывается, а у клиента нет». Разница только в трёх буквах, которые кто-то один набирает по привычке.

Что с этим делать:

  • выпускать сертификат сразу на оба имени, -d saitfix.ru -d www.saitfix.ru, это одна строка и ноль дополнительных денег;
  • держать один канонический вариант и редиректить второй, но редирект тоже отдаётся по https, поэтому сертификат на нём всё равно нужен;
  • поддомены вроде shop., lk., staging. считать отдельными сайтами и не забывать про них при выпуске.

Тестовая копия на поддомене с протухшим сертификатом кажется мелочью, ровно до момента, когда на неё приходит робот поисковика или клиент, которому вы полгода назад скинули ссылку на согласование.

Проверка после починки

Замок в адресной строке появился, и на этом обычно все расходятся. Зря: половина хвостов вылезает через день.

Что я прогоняю каждый раз:

  1. Главная и любая внутренняя страница в режиме инкогнито, с телефона по мобильному интернету. Обычная вкладка врёт из-за кэша.
  2. Редиректы без петли:
curl -sIL http://saitfix.ru | grep -E "^HTTP|^[Ll]ocation"

Должно быть максимум два перехода и финальный 200. Три и больше означают, что правила спорят между собой.

  1. Полнота цепочки. Браузер на десктопе часто подтягивает промежуточный сертификат сам и молчит, а старый Android и внешние сервисы валятся с ошибкой доверия. openssl s_client без -showcerts покажет Verify return code: 0 (ok), если всё в порядке.
  2. Смешанный контент: после перевыпуска иногда всплывают старые ссылки на картинки по http, замок становится серым с предупреждением.
  3. Формы. Отправить тестовую заявку и убедиться, что она дошла в почту и в мессенджер. Обработчик формы ходит по https сам к себе чаще, чем кажется.
  4. Оплата и внешние интеграции: тестовый платёж, обмен с 1С, вебхуки. Именно они молчат дольше всего.
  5. Счётчик Метрики: проверить, что хиты снова идут, и отметить период аварии, чтобы через месяц не искать несуществующую проблему с трафиком.
  6. Вебмастер: отправить главную на переобход, если простой длился больше суток.

Как узнавать за две недели, а не от клиента

Это единственная часть статьи, которая экономит деньги, а не тратит их. Настраивается один раз.

Первый вариант, бесплатный и без сервера. UptimeRobot умеет следить за сроком сертификата и присылать уведомление за 14, 7 и 1 день. Pinger и подобные российские сервисы делают то же самое от 350 рублей в месяц, зато с оповещением в Telegram и без проблем с оплатой зарубежной картой. Общая логика мониторинга доступности разобрана в статье про мониторинг сайта, там же про то, куда должны падать алерты, чтобы их кто-то прочитал.

Второй вариант, свой скрипт на любом сервере с доступом в интернет. Кладём в /usr/local/bin/ssl-check.sh:

#!/bin/sh
DOMAIN="saitfix.ru"
TOKEN="123456:AA..."
CHAT="12345678"

END=$(echo | openssl s_client -connect "$DOMAIN":443 -servername "$DOMAIN" 2>/dev/null 
  | openssl x509 -noout -enddate | cut -d= -f2)
LEFT=$(( ( $(date -d "$END" +%s) - $(date +%s) ) / 86400 ))

if [ "$LEFT" -lt 14 ]; then
  curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" 
    -d chat_id="$CHAT" 
    -d text="$DOMAIN: сертификат истекает через $LEFT дн."
fi

И в crontab одну строку:

0 9 * * * /usr/local/bin/ssl-check.sh

Важная деталь: скрипт должен жить не на том же сервере, что и сайт. Когда сервер ляжет целиком, вместе с ним ляжет и сторож. Я держу такие проверки на отдельной машине, которая обслуживает всех клиентов сразу.

Третье, про что стоит знать заранее. Максимальный срок жизни публичных сертификатов сокращается: с марта 2026 года потолок 200 дней, дальше по графику CA/Browser Forum он будет уменьшаться и к 2029 году дойдёт до полутора месяцев. Ручное продление раз в год ещё как-то жило. Ручное продление раз в семь недель не выживет ни у кого. Если автопродление до сих пор не настроено, это вопрос ближайшего года, а не отдалённого будущего.

Кто за этим следит и сколько стоит

Честный ответ: следить должен тот, у кого есть доступ к серверу и привычка смотреть в мониторинг. У владельца бизнеса такой привычки нет и быть не должно.

В моей абонентке проверка срока сертификатов входит в базу вместе с бэкапами, обновлениями и мониторингом доступности. Годовой тариф 35 000 рублей, помесячный от 15 000, детали на странице тарифов. Разовое восстановление просроченного сертификата с разбором причины и настройкой автопродления я делаю за час-полтора, но платить за аварию всегда дороже, чем за то, чтобы её не было.

Что в такие работы не входит: разработка сайта с нуля и дизайн. Я занимаюсь чужими сайтами, которые уже работают, и слежу, чтобы они продолжали работать.

Если сертификат истёк прямо сейчас и разбираться некогда, напишите через форму и приложите домен с названием хостинга. По этим двум строчкам обычно уже понятно, куда идти и сколько это займёт. Остальные разборы по безопасности собраны в рубрике.

Частые вопросы

Что делать, если истёк SSL-сертификат

Перевыпустить: через панель хостинга или штатной утилитой на сервере. Это минуты. Дальше разобраться, почему сломалось автопродление, иначе история повторится через три месяца.

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

Обычно из-за редиректа, который перехватывает служебный путь проверки, из-за прав на папку или из-за того, что домен переехал. Уведомлений об этом никто не шлёт, поэтому узнают от клиентов.

Сколько стоит сертификат

Ноль, если брать бесплатный. Платный на один домен стоит порядка 800-2500 рублей в год, на все поддомены сразу от 4000. Покупать имеет смысл только второй вариант и только при реальной нужде.

Как узнавать заранее

Поставить мониторинг срока действия сертификата с уведомлением за две недели. Это бесплатно и снимает весь класс проблемы.

Передайте техническую часть в надёжные руки.

Слежу за хостингом, бэкапами и обновлениями. Когда что-то пойдёт не так – звоните мне, не своему программисту, не в спортзал и не маме.

Короткие вопросы по теме

Все вопросы по теме "Безопасность сайта"

Заявка

Обсудим задачу

Напишите имя и телефон, выберите удобный канал. Перезвоню или напишу в течение часа в рабочее время.

Куда удобнее ответить?