Проверка TLS-сертификата

Мы открываем TLS-соединение с сайтом так же, как браузер, и читаем его сертификат, даже испорченный. Если с ним что-то не так, вы узнаете, с какой из типичных неполадок имеете дело.

Или попробуйте github.com, expired.badssl.com

Зачем нужен сертификат

Когда браузер подключается к https://example.com, ему кто-то отвечает. Принадлежит ли этот кто-то example.com, это уже другой вопрос. Ответить вместо сайта мог любой, кто находится в сети посередине.

Поэтому сервер должен предъявить документ. Сертификат: это небольшой файл, в котором есть открытый ключ, список имён хостов, от имени которых этот ключ может выступать, дата начала, дата окончания и подпись удостоверяющего центра (CA), проверившего, кто управляет этими именами. Браузер идёт по своему списку. Имя в адресной строке должно быть в сертификате. Сегодняшняя дата должна лежать между двумя датами. Подпись должна вести к центру, которому устройство уже доверяет. И сервер должен доказать, что владеет соответствующим закрытым ключом. Не выполнено хоть одно условие, и посетитель видит предупреждение во весь экран.

Шифрование начинается только после того, как всё это проверено. Замок означает, что сервер доказал, кто он, и шифрование опирается на это доказательство.

Что проверяет инструмент

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

ПроверкаРезультат
ДатыКрасный, если срок истёк или ещё не начался. Жёлтый, если осталось меньше 7 дней, примечание, если меньше 21 дня, иначе зелёный.
ИменаКрасный, если введённое вами имя хоста не покрыто. Жёлтый, если его близнец (с www или без) есть в DNS, но отсутствует в сертификате.
ДовериеЕсли проверка не прошла, вы увидите причину: срок истёк, неверное имя, самоподписанный, неполная цепочка или исходная ошибка проверки.
Порядок цепочкиЖёлтый, если присланные сертификаты не подписывают друг друга по порядку.
Ключ и подписьКрасный для ключа RSA короче 2048 бит или подписи SHA-1 или MD5.
ПротоколКрасный, если соединение установлено по протоколу старше TLS 1.2.

Затем он запрашивает четыре формы адреса (http и https, с www и без) и показывает, куда приводит каждая и присылает ли сайт заголовок HSTS. Если нужна эта часть по шагам, это делает трассировка перенаправлений.

В Chrome работает, везде остальном нет

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

Когда сервер отправляет только свой сертификат, Chrome и Edge на компьютере к этому снисходительны. Они часто скачивают недостающий промежуточный или берут тот, что видели на другом сайте. Firefox с новым профилем, старые телефоны на Android, curl, платёжные вебхуки, почтовые серверы и большинство библиотек в языках программирования такой услуги не окажут. Так и получается сайт, который владельцу кажется идеальным, а у API-клиента не работает. Инструмент называет это Неполная цепочка и сообщает о ней, когда проверка не прошла, а прислан был только один сертификат.

Как исправить типичные неполадки

  • Срок истёк. Автоматические сертификаты продлеваются примерно за 30 дней до конца, так что если ваш закончился, задание продления не срабатывает уже несколько недель. С Certbot запустите certbot renew --dry-run и прочитайте ошибку. Обычно это переехавшая DNS-запись, брандмауэр, закрывший порт 80, или перенаправление, которое проглатывает /.well-known/acme-challenge/.
  • Имя не покрыто. Запросите сертификат заново и перечислите все имена хостов: certbot -d example.com -d www.example.com. Wildcard *.example.com покрывает один уровень поддоменов. Сам example.com он не покрывает, и на этом попадаются многие.
  • Неполная цепочка. Укажите серверу файл с полной цепочкой. В nginx: ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;. В Apache 2.4.8 и новее SSLCertificateFile принимает тот же файл.
  • Самоподписанный. Замените его сертификатом от публичного центра. Let’s Encrypt, ZeroSSL и Google Trust Services выдают их бесплатно.
  • Старый протокол. Включите TLS 1.2 и 1.3. В nginx: ssl_protocols TLSv1.2 TLSv1.3;

То же самое можно увидеть в терминале командой openssl s_client -connect example.com:443 -servername example.com.

Инструмент обращается к одному IP-адресу на порту 443 и сообщает согласованный протокол, а не все версии, которые принял бы сервер. Сайт, распределённый по нескольким серверам, может показывать на другом адресе другой сертификат. Отзыв сертификата не проверяется.

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

SSL и TLS: это одно и то же?

TLS: это нынешнее название протокола. До него был SSL, последняя версия которого выведена из употребления в 2015 году. По привычке до сих пор говорят «SSL-сертификат», но все используемые сегодня сертификаты работают с TLS.

Сколько действует SSL-сертификат?

Сертификаты Let’s Encrypt действуют 90 дней. Для всех публичных центров максимальный срок в марте 2026 года сократился с 398 до 200 дней, в марте 2027 года он упадёт до 100 дней, а в марте 2029 года до 47 дней. При таком темпе продлевать вручную становится нереально.

Сертификат действителен. Почему браузер всё равно пишет «Не защищено»?

Обычно по одной из трёх причин. Страница открыта по http:// и ничто не перенаправляет её на HTTPS, сертификат не покрывает точное имя хоста в адресной строке, или страница загружает скрипты или изображения по обычному HTTP. О первой причине расскажет таблица перенаправлений в результате.

Что значит ERR_CERT_COMMON_NAME_INVALID?

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

Бесплатный сертификат менее надёжен, чем платный?

Нет. Шифрование одинаковое, и браузеры относятся к ним одинаково. Вы платите за поддержку, гарантию или данные вашей организации внутри сертификата, а браузеры больше не выставляют их на видное место.

За сколько времени продлевать сертификат?

Автоматические клиенты продлевают, когда остаётся треть срока, примерно 30 дней для 90-дневного сертификата. Если осталось 7 дней (с этого момента эта проверка начинает предупреждать), автоматизация, скорее всего, перестала работать.