Как на самом деле работают HTTPS и TLS: рукопожатие
Вы вводите URL, нажимаете Enter, и появляется замок. Но что на самом деле происходит между вашим браузером и сервером, чтобы соединение стало безопасным? Многие разработчики воспринимают HTTPS как чёрный ящик — пока что-то не сломается, например, ошибка сертификата или проблема с производительностью. Эта статья приоткрывает завесу над TLS — протоколом, лежащим в основе HTTPS, — и объясняет рукопожатие простыми словами.
Что на самом деле представляет собой HTTPS
HTTPS — это просто HTTP, работающий поверх TLS (Transport Layer Security). TLS обеспечивает три гарантии:
- Конфиденциальность — данные шифруются, чтобы подслушивающие не могли их прочитать.
- Целостность — данные не могут быть изменены при передаче незаметно.
- Аутентификация — вы общаетесь с настоящим сервером, а не с самозванцем.
Без TLS протокол HTTP передаёт всё в открытом виде: пароли, куки и данные форм видны любому на сетевом пути.
Рукопожатие TLS простыми словами
Рукопожатие — это согласование, которое происходит до отправки любых данных приложения. Его цель: договориться об алгоритмах шифрования, проверить подлинность сервера и установить общие секретные ключи. Вот как проходит рукопожатие в TLS 1.3, современном стандарте:
- Client Hello — браузер отправляет список поддерживаемых наборов шифров, случайное значение и свой ключевой обмен (для обмена ключами).
- Server Hello — сервер выбирает набор шифров, отправляет своё случайное значение и ключевой обмен, а также предоставляет цепочку сертификатов.
- Проверка сертификата — браузер проверяет сертификат по доверенным корневым центрам сертификации (CA), проверяет доменное имя и срок действия.
- Выработка ключей — обе стороны вычисляют один и тот же общий секрет с помощью обмена ключами (обычно ECDHE). Выводятся сеансовые ключи.
- Finished — обе стороны отправляют MAC по стенограмме рукопожатия, чтобы подтвердить, что ничего не было подменено.
После этого передаются зашифрованные данные приложения. В TLS 1.3 рукопожатие занимает один круговой обход (1-RTT), а при возобновлении сеанса можно достичь 0-RTT.
TLS 1.2 против TLS 1.3
TLS 1.2 требовал двух круговых обходов и поддерживал более слабые алгоритмы. TLS 1.3 удалил устаревшие шифры, упростил рукопожатие и шифрует большую часть самого рукопожатия. Всегда предпочитайте TLS 1.3; большинство современных серверов и браузеров его поддерживают.
Сертификаты: якорь доверия
Сертификат связывает открытый ключ с доменным именем и подписывается центром сертификации (CA). Браузеры поставляются с хранилищем доверенных корневых CA. При проверке браузер строит цепочку от сертификата сервера до доверенного корня.
Распространённые типы сертификатов:
- DV (Domain Validation) — подтверждает контроль над доменом; быстрый и бесплатный (например, Let's Encrypt).
- OV (Organization Validation) — включает проверенные данные компании.
- EV (Extended Validation) — более строгая проверка личности; в большинстве браузеров больше не отображается зелёная строка.
Сертификаты истекают. Автоматизируйте продление с помощью ACME-клиентов, таких как Certbot, чтобы избежать простоев.
Обмен ключами и совершенная прямая секретность
Современный TLS использует эфемерный обмен ключами (ECDHE). Каждый сеанс генерирует новую пару ключей, поэтому даже если закрытый ключ сервера позже будет скомпрометирован, прошлые сеансы нельзя расшифровать. Это свойство называется прямой секретностью (forward secrecy). Избегайте статического обмена ключами RSA, который не обеспечивает эту защиту.
Распространённые ошибки HTTPS и как их избежать
- Смешанный контент — загрузка HTTP-ресурсов на HTTPS-странице вызывает предупреждения браузера. Используйте относительные URL или перейдите на HTTPS.
- Просроченные сертификаты — настройте мониторинг и автоматическое продление.
- Слабые наборы шифров — отключите TLS 1.0/1.1 и RC4/3DES. Используйте инструмент вроде SSL Labs для проверки.
- Отсутствие HSTS — добавьте заголовок
Strict-Transport-Security, чтобы принудительно использовать HTTPS.
Отладка проблем TLS
Когда рукопожатие не удаётся, используйте openssl s_client для проверки соединения:
openssl s_client -connect example.com:443 -servername example.com
Это покажет цепочку сертификатов, согласованный протокол и шифр. Для ошибок, специфичных для браузера, проверьте панель Security в DevTools.
Часто задаваемые вопросы
HTTPS — это то же самое, что TLS?
HTTPS — это HTTP поверх TLS. TLS — это криптографический протокол; HTTPS — защищённая версия прикладного протокола HTTP.
Нужен ли отдельный сертификат для каждого поддомена?
Не обязательно. Wildcard-сертификат покрывает все поддомены первого уровня, а многодоменный сертификат (SAN) может содержать несколько имён.
Как TLS 1.3 улучшает производительность?
TLS 1.3 сокращает рукопожатие до одного кругового обхода (и нуля при возобновлении) и упрощает согласование шифров, снижая задержку.
Готовы проверить безопасность своего сайта? Используйте наш анализатор логов Nginx, чтобы выявить подозрительные ошибки TLS и сбои рукопожатия в ваших логах.