Как просроченный SSL-сертификат выбил магазин из Google за 48 часов
Сертификат истёк в среду в 03:14. В пятницу утром органический трафик рухнул. Это не невезение — это измеримая халатность.
Магазин офисного оборудования в Порту потерял 78% органического трафика между средой и пятницей. Сайт никто не трогал неделями. Проблема умещалась в одной строке лога: SSL-сертификат истёк в среду в 03:14.
Когда Googlebot вернулся на сайт тем же утром, он получил ERR_CERT_DATE_INVALID. Ничего не проиндексировал. Хуже того — пометил домен как небезопасный для пользователей, которые кликали по ещё закешированным результатам. За 48 часов Chrome уже показывал красный экран предупреждения вместо домашней страницы.
Почему Google реагирует так жёстко
С 2014 года HTTPS — это сигнал ранжирования. С 2018 года Chrome помечает HTTP как «небезопасный». Просроченный сертификат хуже, чем HTTP — это сломанный HTTPS. Браузер трактует это как попытку подмены, даже если виноват всего лишь acme.sh, который не справился с обновлением.
Googlebot воспринимает провалившийся TLS-handshake как ошибку обхода. Повторяет попытку, проваливается, повторяет, проваливается. Через несколько часов начинается деиндексация. Страницы не исчезают из индекса мгновенно, но теряют позиции, потому что сигнал доверия упал до нуля.
Как это выглядело на практике
- 03:14 среда — сертификат Let's Encrypt истекает. Cron-задача на обновление падала три раза за предыдущие 30 дней. Письма никто не прочитал.
- 08:00 среда — первые пользователи с мобильных видят красное предупреждение. Bounce rate взлетает.
- 11:30 среда — Googlebot заходит, не проходит handshake, массово фиксирует soft 404.
- Четверг утром — Search Console шлёт уведомление о «покрытии». Search Console никто не открывает.
- Пятница 09:00 — продажи встали. Клиент звонит программисту. Программист находит причину за четыре минуты.
Само обновление заняло 90 секунд. Восстановление позиций — 23 дня. За это время конкурент занял первые места по основным запросам и так и не уступил их полностью.
Почему cron провалился
Сервер сменил IP в январе. DNS указывал правильно, но HTTP-01-челлендж Let's Encrypt упирался в новый файрвол, который блокировал запросы из диапазона ISRG. Каждая попытка обновления писала ошибку в лог, который никто не читал.
Это типичный сценарий. Сертификат истекает не потому, что обновлять сложно. Он истекает, потому что автообновление падает молча и ни у кого нет алертов, направленных на правильные логи.
Что нужно сделать сегодня
- Внешний мониторинг самого сертификата, а не cron-задачи. Поставь UptimeRobot или StatusCake с уведомлением за 14 дней до истечения.
- Алерты в Telegram или SMS, не на email. Письма от Let's Encrypt уходят в ящик, который никто не открывает.
- Заглядывай в Search Console каждую неделю. Если Googlebot падает — это там написано.
- Раз в квартал прогоняй обновление вручную. Если cron работает в продакшене, но не в staging — у тебя дрейф конфигурации.
- Опиши процедуру экстренного обновления. Когда сайт упадёт в пятницу в 18:00, ты не захочешь разбираться с acme.sh с нуля.
Просроченный сертификат — самый дешёвый способ потерять полгода SEO. Предотвратить стоит ноль евро, восстановить — три месячных зарплаты.— Внутренний пост-инцидентный аудит, клиент из Порту
Реальная цена
За тот месяц магазин заработал на 31 тысячу евро меньше, чем в среднем за квартал. Программист, который поднимал сервер, взял 180 евро за починку. Цена профилактики была нулевой — один дополнительный cron health check и вебхук в Telegram.
Если ты продаёшь онлайн в России и до сих пор не настроил независимый мониторинг своего сервера, который следит за сертификатом — ты в одном проваленном обновлении от потери квартала. Это не паника. Это арифметика.
Правило простое. Не доверяй крону, который обновляет. Доверяй внешнему монитору, который проверяет, что крон обновил.