Как устанавливается HTTPS-соединение: подробный разбор TLS
TLS-handshake (TLS-рукопожатие)
TLS-рукопожатие позволяет клиенту и серверу установить общие секретные ключи, с помощью которых они будут безопасно обмениваться данными.
Термин SSL используют по привычке, но реально применяется TLS.
Приветственные сообщения (Hello Messages)
- ClientHello — клиент начинает рукопожатие и сообщает версию TLS, список поддерживаемых CipherSuites, а также случайное число client random для генерации ключей.
- ServerHello — сервер выбирает один из предложенных алгоритмов, отправляет server random и идентификатор сессии.
Аутентификация
- Server Certificate — сервер отправляет цифровой сертификат, подтверждая свою подлинность.
- Client Certificate Request (опционально) — сервер может запросить сертификат клиента.
- Client Certificate — клиент отправляет сертификат и подтверждает владение приватным ключом сообщением Certificate Verify.
- Проверка сертификатов — клиент проверяет сертификат сервера (подпись, срок действия, доверие к CA). Сервер, если запросил, проверяет сертификат клиента.
Генерация общего ключа
- Client Key Exchange — клиент отправляет данные для генерации pre-master secret.
• В TLS 1.2 при использовании RSA pre-master шифруется публичным ключом сервера.
• При использовании (EC)DHE клиент и сервер обмениваются ключами и независимо вычисляют общий секрет. - Из pre-master получается master secret, затем формируется session key — симметричный ключ для обеих сторон.
Установка защищённого канала
- Change Cipher Spec — стороны сообщают, что переходят на новые ключи и алгоритмы шифрования.
- Finished — клиент отправляет зашифрованное сообщение Finished, сервер отвечает своим Finished.
С этого момента весь трафик шифруется симметричным session key.
Что такое CipherSuites
CipherSuite — набор правил для шифрования. Он определяет:
• способ обмена ключами
• алгоритм симметричного шифрования
• метод проверки целостности данных
• алгоритм цифровой подписи
RSA и (EC)DHE
RSA — асимметричный алгоритм (публичный + приватный ключ). В старых версиях TLS использовался для передачи секрета: клиент шифрует данные публичным ключом сервера.
ECDHE — алгоритм, который позволяет обеим сторонам динамически сгенерировать общий секретный ключ.
Главное отличие:
• RSA: весь секрет завязан на приватный ключ сервера. Если он скомпрометирован — можно расшифровать старый трафик.
• ECDHE: ключ генерируется для каждой сессии отдельно, старые данные остаются защищёнными (Perfect Forward Secrecy).
Что важно знать
SSL — устарел, используется только как термин.
TLS — современный протокол защиты соединений.
Шаги рукопожатия:
- Приветствие — согласование версии и алгоритмов.
- Аутентификация — проверка сертификатов.
- Генерация ключей — создание секретов для шифрования.
- Установка канала — обмен зашифрованными Finished.
CipherSuites — набор правил шифрования.
RSA — использовался в TLS 1.2.
ECDHE — используется в TLS 1.3 и обеспечивает стойкость и защиту прошлых сессий.