Skip to content

Как отладить TLS-handshake

Коротко:

TLS-handshake failures — один из самых сложных debug-категорий. Инструменты: openssl s_client для shell, Wireshark с TLS decryption для deep analysis, curl -v для application-level. Основные signals: ALPN mismatch (HTTP/2 vs 1.1), SNI missing, cert chain incomplete, cipher no overlap, TLS version downgrade.

Ниже: пошаговая инструкция, рабочие примеры, типичные ошибки, FAQ.

Пошаговая настройка

  1. Быстрый probe: openssl s_client -connect example.com:443 -servername example.com -showcerts
  2. Проверьте ALPN: openssl s_client -alpn h2,http/1.1 -connect example.com:443
  3. Проверьте TLS versions: openssl s_client -tls1_3 -connect example.com:443, -tls1_2, -tls1
  4. Проверьте specific cipher: openssl s_client -cipher ECDHE-RSA-AES128-GCM-SHA256 -connect example.com:443
  5. Network-level с Wireshark: capture tcp port 443, использовать "(pre)-Master-Secret log" для расшифровки
  6. Application-level: curl -v https://example.com 2>&1 | grep -E "SSL|TLS|ALPN"
  7. Оценка overall: Enterno SSL checker — grade + full chain + issues

Рабочие примеры

СценарийКонфиг
Basic handshake probeopenssl s_client -connect example.com:443 -servername example.com </dev/null 2>&1 | grep -E "Protocol|Cipher"
ALPN negotiationopenssl s_client -alpn h2 -connect example.com:443 </dev/null | grep -i alpn
Test TLS 1.3openssl s_client -tls1_3 -connect example.com:443 </dev/null
Wireshark filtertcp.port == 443 and tls.record.content_type == 22 # handshake records
curl с cipherscurl -v --tls13-ciphers TLS_AES_128_GCM_SHA256 https://example.com 2>&1 | grep "SSL connection"

Типичные ошибки

  • Без -servername openssl не отправляет SNI → сервер выдаст default cert, не ваш
  • Wireshark без TLS keys не расшифрует payload (но metadata виден)
  • curl CURLOPT_VERBOSE на PHP не показывает TLS handshake детали, только application
  • Session tickets кешируют и replay-ают успешный handshake — для dedug используйте -no_ticket
  • Corporate proxy с TLS-inspection влияет на handshake результат — тестируйте из-за proxy
СертификатСрок, издатель, домены (SAN)
ЦепочкаПроверка промежуточных и корневых CA
TLS-протоколВерсия TLS и набор шифров
УязвимостиHeartbleed, POODLE, слабые шифры

Почему нам доверяют

TLS 1.3
поддержка
Полная
цепочка CA
<2с
результат
30/14/7
дней до истечения

Как это работает

1

Введите домен

2

Проверка цепочки TLS

3

Дата истечения и уязвимости

Что проверяет SSL-тест?

SSL/TLS — протокол шифрования, который защищает данные между браузером и сервером. Наш инструмент анализирует сертификат, цепочку доверия, версию TLS и известныеуязвимости.

Детали сертификата

Издатель, срок действия, алгоритм подписи, покрываемые домены (SAN) и тип валидации (DV/OV/EV).

Цепочка доверия

Проверка полной цепочки: от конечного сертификата через промежуточные до корневого CA.

Анализ TLS

Версия протокола (TLS 1.2/1.3), набор шифров, поддержка Perfect Forward Secrecy (PFS).

Оповещения об истечении

Создайте монитор — получайте уведомления в Telegram и email за 30/14/7 дней до истечения.

DV vs OV vs EV сертификаты

DV (Domain Validation)
  • Подтверждение только владения доменом
  • Выдаётся за минуты автоматически
  • Бесплатно через Let's Encrypt
  • Подходит для большинства сайтов
  • Самый распространённый тип
OV / EV
  • Проверка организации (OV) или расширенная проверка (EV)
  • Выдаётся за 1-5 рабочих дней
  • Стоимость от $50 до $500/год
  • Для финансов, e-commerce, госсайтов
  • Повышает доверие пользователей

Кому это нужно

DevOps

мониторинг SSL-сертификатов

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

аудит TLS-конфигурации

SEO

HTTPS как фактор ранжирования

E-commerce

доверие покупателей

Частые ошибки

Истёкший сертификатБраузеры блокируют сайт с истёкшим SSL. Настройте автопродление или мониторинг.
Неполная цепочка сертификатовБез промежуточного CA некоторые браузеры и боты не смогут верифицировать сертификат.
Mixed content на HTTPS-сайтеHTTP-ресурсы на HTTPS-странице — замок в браузере пропадает, снижается доверие.
Использование TLS 1.0/1.1Устаревшие версии TLS содержат известные уязвимости. Используйте TLS 1.2+ или 1.3.
Несовпадение домена в сертификатеСертификат должен покрывать все домены сайта, включая www и поддомены.

Лучшие практики

Настройте автопродлениеLet's Encrypt + certbot с cron — сертификат обновляется автоматически каждые 60-90 дней.
Включите HSTSЗаголовок Strict-Transport-Security заставляет браузер всегда использовать HTTPS.
Используйте TLS 1.3TLS 1.3 быстрее (1-RTT handshake) и безопаснее — убраны устаревшие шифры.
Мониторьте срок действияСоздайте монитор на Enterno.io — получайте уведомления задолго до истечения.
Проверяйте цепочку после обновленияПосле обновления сертификата убедитесь, что промежуточные сертификаты установлены.

Получите больше с бесплатным аккаунтом

Мониторинг SSL-сертификатов, история проверок и уведомления за 30 дней до истечения.

Зарегистрироваться (FREE)

Больше по теме

Часто задаваемые вопросы

Как расшифровать Wireshark capture?

Запустите browser с <code>SSLKEYLOGFILE=/tmp/sslkeys.log</code>. В Wireshark → Edit → Preferences → TLS → (Pre)-Master-Secret log → /tmp/sslkeys.log.

openssl показывает old cipher — нормально?

Да, sever предлагает в порядке preference. Чтобы увидеть negotiated cipher — смотрите "Cipher: XXX" в output.

Как проверить OCSP stapling?

<code>openssl s_client -status -connect example.com:443 </dev/null 2>&amp;1 | grep "OCSP Response"</code>. Должно быть "OCSP Response Status: successful".

Как узнать TLS version в бразузере?

DevTools → Security tab → Connection. Или <code>chrome://net-internals/#ssl</code>.