Загрузка…
Загрузка…
HTTP / REST · middle · сложность 6
TLS-handshake за один (или ноль при resume) round trip согласует шифр, проверяет сертификат и выводит общий симметричный ключ через ephemeral Diffie-Hellman — ключ никогда не передаётся по сети.
1. ClientHello. Клиент отправляет поддерживаемые версии TLS, список cipher-suite, случайный nonce и — важно в TLS 1.3 — key-share (эфемерное DH-значение) плюс SNI (hostname для выбора cert) и ALPN (протокол приложения: h2, h3, http/1.1).
2. ServerHello + Certificate. Сервер выбирает cipher, отправляет свой key-share и nonce, и цепочку сертификатов: leaf для домена, подписанный intermediate CA, до root CA в trust store клиента. Клиент проверяет подписи, совпадение домена, срок и отзыв (OCSP).
3. Вывод ключа. Обе стороны имеют публичные ephemeral DH друг друга и свои приватные. Diffie-Hellman позволяет независимо вычислить одинаковый shared secret без передачи по wire. Из него — session keys. Сертификат нужен для аутентификации (доказать, что сервер владеет DH-ключом), а не для шифрования session key — частое заблуждение.
4. Finished. Обе стороны отправляют MAC по всему transcript handshake — tampering (downgrade) обнаруживается. Далее — зашифрованный трафик приложения.
Forward secrecy. DH-ключи свежие на сессию и выбрасываются — захват сегодняшнего трафика и кража приватного ключа через год не расшифрует прошлое. TLS 1.3 делает ephemeral DH обязательным; старый RSA key-transport без forward secrecy ушёл.
TLS 1.3 speed. Handshake сократили с 2 RTT до 1 — клиент угадывает key-share заранее. Session resumption с pre-shared key даёт 0-RTT: данные в первом пакете. Но 0-RTT replayable — только идемпотентные запросы.
TLS 1.3 = 1 RTT + forward secrecy; сертификат аутентифицирует сервер, ключ сессии рождается из ephemeral DH, а не «передаётся зашифрованным».