Частые ошибки SSL-сертификата и как их исправить
Практика3 минРедакция Innovialabs
Коротко
Почти все проблемы с SSL сводятся к пяти причинам: сертификат истёк, не покрывает имя сайта, отдаётся без промежуточной цепочки, страница грузит ресурсы по HTTP или HTTP и HTTPS перенаправляют друг на друга по кругу.
Коротко: пять типичных ошибок
| Симптом в браузере | Причина | Исправление |
|---|---|---|
NET::ERR_CERT_DATE_INVALID | сертификат истёк | продлить и перезагрузить веб-сервер |
ERR_CERT_COMMON_NAME_INVALID | имя сайта не входит в сертификат | перевыпустить с нужными именами |
ошибка только на части устройств или в curl | неполная цепочка | отдавать fullchain |
| «Не защищено», значок замка с предупреждением | смешанный контент | перевести ресурсы на HTTPS |
ERR_TOO_MANY_REDIRECTS | цикл редиректов | одно место для редиректа, правильный режим прокси |
Точные тексты ошибок отличаются в разных браузерах, но причины те же.
Сначала посмотрите, что на самом деле отдаёт сервер:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates -ext subjectAltName
Команда покажет, на какие имена выпущен сертификат, кто его выдал и до какой даты он действует.
1. Сертификат истёк
Как понять: дата notAfter в выводе выше уже прошла.
Что делать:
- продлите сертификат (для Let's Encrypt —
sudo certbot renew); - перезагрузите веб-сервер: частая ситуация, когда новый файл уже лежит на диске, а сервер отдаёт старый из памяти;
- настройте автопродление и внешний мониторинг срока действия.
Если ошибка появляется у одного пользователя, а у остальных всё в порядке, проверьте дату и время на его устройстве: неверные часы дают ту же ошибку.
2. Имя не совпадает с сертификатом
Как понять: в списке subjectAltName нет имени, которое открывает посетитель. Классика: сертификат на example.com, а заходят на www.example.com.
Что делать:
- перевыпустите сертификат со всеми нужными именами:
-d example.com -d www.example.com; - помните, что wildcard
*.example.comне покрывает самexample.comи вложенные имена вродеa.b.example.com; - если на одном IP несколько сайтов, проверьте, что для каждого
server_nameуказан свой сертификат: при ошибке сервер отдаёт сертификат сайта по умолчанию.
3. Неполная цепочка сертификатов
Как понять: в настольном браузере сайт открывается, а на части телефонов, в curl или в интеграциях — ошибка вроде «unable to get local issuer certificate». Браузеры иногда достраивают цепочку сами, другие клиенты этого не делают.
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null
Если в выводе только один сертификат, промежуточного не хватает.
Что делать: укажите в конфиге файл с полной цепочкой. Для Let's Encrypt это fullchain.pem. Для платного сертификата склейте свой сертификат и промежуточный от центра сертификации в один файл — сначала ваш, затем промежуточный.
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
4. Смешанный контент
Как понять: сертификат в порядке, но браузер ругается на страницу, а в консоли разработчика есть предупреждения Mixed Content. Страница по HTTPS загружает картинки, скрипты или стили по http://.
Что делать:
- замените ссылки на
https://или относительные пути; - в CMS обновите адрес сайта в настройках и пройдитесь по базе, где сохранены старые ссылки;
- как временную страховку добавьте заголовок:
add_header Content-Security-Policy "upgrade-insecure-requests";
Заголовок попросит браузер грузить ресурсы по HTTPS, но если ресурс по HTTPS недоступен, он всё равно не загрузится.
5. Бесконечные редиректы
Как понять: ERR_TOO_MANY_REDIRECTS. Посмотрите цепочку:
curl -sIL http://example.com | grep -i -E "^(HTTP|location)"
Типичные причины:
- CDN или прокси в режиме «Flexible» (например, в Cloudflare): посетитель приходит по HTTPS, прокси идёт к серверу по HTTP, а сервер редиректит на HTTPS — и так по кругу. Решение: установить сертификат на сервере и включить режим Full (strict).
- Приложение за прокси не видит HTTPS. Передавайте заголовок
X-Forwarded-Protoи настройте приложение доверять ему. - Редирект настроен в двух местах — в веб-сервере и в CMS или плагине, и они противоречат друг другу (например,
wwwпротив безwww). Оставьте одно правило.