Коротко. Ошибка SSL-сертификата на сервере почти всегда сводится к одной из четырёх причин: истёк срок, домен не совпадает с именами в сертификате, отдаётся неполная цепочка или nginx подставляет чужой сертификат из другого блока. Диагностика занимает пять минут: код ошибки в браузере называет класс проблемы, а команда openssl s_client показывает, что сервер реально отдаёт. Ключевая ловушка — неполная цепочка: сайт открывается в десктопном Chrome и падает на Android, в curl и у платёжных шлюзов. Лечится подстановкой fullchain вместо cert в конфиг и перезагрузкой nginx.
Шаг первый: прочитать код ошибки
Браузер почти всегда называет причину — нужно только развернуть подробности и посмотреть на код. Не пытайтесь чинить сертификат, пока не знаете, какая именно проверка не прошла.
| Код | Что означает | Куда смотреть |
|---|---|---|
| NET::ERR_CERT_DATE_INVALID | Срок действия истёк или ещё не начался | Даты сертификата на сервере; часы на устройстве посетителя |
| NET::ERR_CERT_COMMON_NAME_INVALID | Запрошенного имени нет в сертификате | Список SAN: забыли www, поддомен или второй домен |
| NET::ERR_CERT_AUTHORITY_INVALID | Издатель неизвестен клиенту | Неполная цепочка, самоподписанный сертификат, национальный УЦ |
| ERR_SSL_PROTOCOL_ERROR | Соединение не поднялось на уровне TLS | Отключённые протоколы, сервис не на том порту, конфликт конфигов |
| NET::ERR_CERT_REVOKED | Сертификат отозван центром сертификации | Перевыпуск, скомпрометированный ключ, отказ поставщика |
| ERR_TOO_MANY_REDIRECTS | Петля переадресаций, часто на фоне TLS | Cloudflare в режиме Flexible плюс редирект на https в .htaccess |
Отдельный маркер: ошибка видна только у одного пользователя, а у остальных сайт работает. Это почти наверняка не сервер — сбитое время на устройстве, антивирус с перехватом трафика или корпоративный прокси, подменяющий сертификаты.
Шаг второй: посмотреть, что сервер реально отдаёт
Панель хостинга и внешние чекеры показывают отфильтрованную картину. Правду говорит только прямое обращение к порту 443:
- Полный вывод рукопожатия с цепочкой:
openssl s_client -connect example.ru:443 -servername example.ru -showcerts </dev/null. Обратите внимание на строку verify return code — код 0 (ok) означает, что цепочка собралась. - Только даты и имена:
echo | openssl s_client -connect example.ru:443 -servername example.ru 2>/dev/null | openssl x509 -noout -dates -subject -issuer. - Проверка глазами клиента без браузерных послаблений:
curl -Iv https://example.ru. Если curl ругается, а Chrome молчит — цепочка неполная. - Сколько сертификатов в файле цепочки:
openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout. Для Let’s Encrypt их должно быть минимум два.
Параметр -servername обязателен: без него сервер не знает, какой сайт вы просите, и на машине с десятком доменов отдаст сертификат первого попавшегося. Половина ложных диагнозов рождается именно здесь.
Неполная цепочка: самая частая и самая коварная причина
Сертификат вашего сайта подписан не корневым центром напрямую, а промежуточным. Клиент должен построить путь от вашего сертификата до корня, которому доверяет система. Промежуточные сертификаты обязан прислать сервер — их нет ни в браузере, ни в операционной системе.
Коварство в том, что десктопный Chrome умеет самостоятельно догружать недостающее звено по ссылке внутри сертификата и маскирует проблему. А вот кто не умеет: Android-браузеры, мобильные приложения, curl и wget, серверы платёжных шлюзов, вебхуки CRM, парсеры поисковых систем. Классическая картина — «у меня всё открывается, но клиенты жалуются, а оплата не проходит».
Причина почти всегда одна: в конфиг подставлен файл только с сертификатом сайта. Правильно так:
ssl_certificate /etc/letsencrypt/live/example.ru/fullchain.pem;— именно fullchain, а не cert.pem;ssl_certificate_key /etc/letsencrypt/live/example.ru/privkey.pem;- для платного сертификата — склеить в один файл ваш сертификат, а следом промежуточные из бандла поставщика, строго в этом порядке.
В cPanel и ISPmanager есть отдельное поле для цепочки (CA bundle) — если оно пустое, вы получите ровно эту ошибку.
Ошибки конфигурации nginx
Второй по частоте источник проблем — сам конфиг. Проверяйте по списку:
- Забыли перезагрузить сервер. Файлы обновились, процесс держит старые в памяти. Лечится:
sudo nginx -t && sudo systemctl reload nginx. - Домена нет ни в одном server_name. Запрос попадает в блок с
default_server, и клиент получает сертификат чужого сайта — отсюда ERR_CERT_COMMON_NAME_INVALID. - Разные конфиги для www и без www. Один блок с сертификатом, второй — со старым или без. Проверяйте оба адреса отдельно.
- Дублирующиеся блоки на 443 порту. nginx возьмёт первый подходящий, и это может быть не тот, который вы правили.
- Ключ не соответствует сертификату — бывает после ручной замены файлов. Сверьте отпечатки:
openssl x509 -noout -modulus -in cert.pem | openssl md5иopenssl rsa -noout -modulus -in privkey.pem | openssl md5должны совпасть. - Права на файл ключа. nginx не стартует или падает в ошибку, если не может прочитать privkey.pem.
- Устаревшие протоколы. Оставленные TLS 1.0 и 1.1 вызывают ошибки у современных клиентов и претензии сканеров безопасности: держите
ssl_protocols TLSv1.2 TLSv1.3;.
Если сайт живёт в контейнере или за балансировщиком, добавьте ещё один слой проверки: сертификат мог обновиться на хосте, но приложение внутри контейнера продолжает держать старую копию до перезапуска. Мы такие вещи вылавливаем при сопровождении серверов — сценарий обновления должен явно перечитывать конфигурацию везде, где сертификат используется.
Когда проблема не на сервере
Прежде чем перекапывать конфиг, исключите внешние причины:
- Время на устройстве посетителя. Сбитая дата — мгновенная ошибка срока действия на всех сайтах сразу.
- Антивирус или корпоративный шлюз, который вскрывает трафик и подписывает страницы своим сертификатом. Проверяется в свойствах сертификата: там будет издатель вроде названия антивируса.
- Старая операционная система. Устройства с давно не обновлявшимися корневыми хранилищами не знают новых центров сертификации.
- Кеш браузера и HSTS. После починки сайт может продолжать ругаться в той же вкладке — проверяйте в режиме инкогнито или на другом устройстве.
- DNS указывает не туда. Домен ведёт на старый сервер, где сертификата нет, а вы правите новый.
Порядок починки и финальная проверка
Рабочая последовательность: определить код ошибки → посмотреть выдачу openssl s_client → сверить имена и даты → проверить количество сертификатов в цепочке → найти блок nginx, который реально обслуживает домен → исправить пути → nginx -t → reload → повторить проверку через curl и с телефона. После починки обязательно пройдите сценарий оплаты и отправку формы: именно интеграции страдают от цепочки первыми, и именно их поломку замечают позже всего. Если сайт после переезда на https ещё и просел в поиске, отдельно проверьте редиректы и канонические адреса — это уже вопрос поискового продвижения, а не сервера. Как правильно ставить сертификат с нуля, разобрано в других материалах раздела о безопасности сайтов.
Почему сайт открывается на компьютере, но выдаёт ошибку на телефоне
Классический признак неполной цепочки сертификатов. Десктопный Chrome умеет догружать недостающий промежуточный сертификат самостоятельно, мобильные клиенты — нет. Проверьте, что в конфиге указан файл fullchain, а не только сертификат домена, и перезагрузите веб-сервер.
Что делать, если ошибка появилась сама по себе ночью
Почти наверняка истёк срок действия: сертификаты кончаются в конкретную минуту, независимо от того, спите вы или нет. Проверьте даты командой openssl, выпустите или продлите сертификат и разберитесь, почему не сработало автопродление — обычно виноват хук, который не перезагружает веб-сервер после обновления файлов.
Как проверить SSL, если сайт ещё не переключён на новый сервер
Обратитесь к серверу напрямую, указав нужное имя вручную: openssl s_client -connect IP:443 -servername example.ru. Так вы увидите, какой сертификат отдаст новая машина, ещё до правки DNS. Это стандартный шаг проверки перед переездом, чтобы не поймать ошибку в момент переключения.
Можно ли временно отключить проверку сертификата у посетителей
Нет, и пытаться не стоит. Пользователь может нажать «Перейти на сайт, небезопасно», но большинство закроет вкладку, а поисковые роботы и платёжные шлюзы обойдут сайт стороной. Единственное правильное решение — выпустить корректный сертификат: бесплатный делается за 5-15 минут.
Кто отвечает за ошибки сертификата — хостинг или подрядчик
На массовом хостинге со встроенным Let’s Encrypt — провайдер. На VPS и выделенном сервере — тот, кто администрирует сервер. Проблема в том, что во многих проектах эта зона не закреплена ни за кем, и об истёкшем сертификате узнают от клиента. Мониторинг сроков должен быть частью договора на поддержку.
Починим SSL и уберём причину, а не симптом
Найдём, где рвётся цепочка, приведём в порядок конфигурацию сервера и поставим мониторинг, чтобы ошибка не повторилась. Диагностика в рамках экспресс-проверки — бесплатно.