TLS-handshake — процедура в начале каждого HTTPS/TLS-соединения, в которой клиент и сервер: (а) договариваются о версии протокола и cipher-suite, (б) сервер доказывает свою идентичность сертификатом, (в) генерируется общий сессионный ключ. Дальше всё, что летит по соединению, шифруется этим ключом.
TLS 1.3 (2018) — 1 round-trip (1-RTT). Клиент шлёт ClientHello с ключевым материалом (для нескольких групп кривых), сервер сразу отвечает ServerHello + Certificate + Finished. Клиент валидирует, шлёт Finished. Всё, соединение готово, appdata полетели. Разница с 1.2: там было 2-RTT (ClientHello → ServerHello → ClientKeyExchange → Finished), задержка старта 100-200 мс на дальнем соединении.
0-RTT resumption: если клиент уже общался с сервером — есть PSK (Pre-Shared Key), может послать appdata сразу с ClientHello, до ответа сервера. Полезно для мобильных клиентов и API. Ограничение: 0-RTT данные подвержены replay-атаке, для критичных операций (payment) отключают.
Cipher suites: TLS 1.3 радикально сократил список — оставили AEAD-only: `TLS_AES_128_GCM_SHA256`, `TLS_AES_256_GCM_SHA384`, `TLS_CHACHA20_POLY1305_SHA256`. Никаких RC4, 3DES, MD5, CBC-based — всё, что уязвимо. TLS 1.2 конфиги надо чистить вручную (см. Mozilla SSL Configurator).
SNI (Server Name Indication) — расширение TLS, клиент шлёт имя хоста в открытом виде на handshake. Позволяет одному IP держать много HTTPS-сайтов. Проблема: провайдер видит, куда вы идёте. ECH (Encrypted Client Hello) — шифрует SNI под ключом, взятым из DNS. Поддержка: Chrome 117+, Cloudflare, но пока не по умолчанию.