Что защищает TLS:
- конфиденциальность — посредник видит только адреса и объём;
- целостность — подменённый байт обнаружится (AEAD-шифры: AES-GCM, ChaCha20-Poly1305);
- подлинность — клиент уверен, что говорит с владельцем домена.
Рукопожатие TLS 1.3 (после TCP-рукопожатия):
- ClientHello — поддерживаемые шифры, случайное число, публичная часть ключа Диффи — Хеллмана (на эллиптических кривых, X25519), имя сервера (SNI);
- ServerHello — выбранный шифр и своя публичная часть DH. Теперь обе стороны независимо вычисляют общий секрет, не передавая его по сети. Дальше всё зашифровано;
- сервер шлёт сертификат и CertificateVerify — подпись хода рукопожатия своим закрытым ключом: доказательство, что ключ у него;
- обе стороны шлют Finished, и клиент может сразу отправлять запрос — один RTT от начала.
Проверка сертификата. Сертификат связывает домен с публичным ключом и подписан удостоверяющим центром (CA). Браузер проверяет цепочку подписей до корневого сертификата из доверенного хранилища ОС или браузера, срок действия, совпадение имени (SAN) и отзыв. Самоподписанный сертификат не проходит проверку, потому что цепочка не ведёт к доверенному корню.
Почему две криптографии. Асимметричные операции медленные, поэтому используются только в рукопожатии — для согласования ключа и подписи. Данные шифруются симметричным шифром с этим общим ключом — это быстро, AES ускорен аппаратно.
Прямая секретность. Ключ сессии получается из эфемерных ключей DH и не зависит от закрытого ключа сертификата. Утечка ключа сервера потом не позволит расшифровать записанный ранее трафик. В TLS 1.3 это обязательно; в 1.2 был режим с RSA-обменом без прямой секретности.
TLS 1.3 против 1.2: рукопожатие за 1 RTT вместо 2, 0-RTT при возобновлении (с риском повтора запроса — только для идемпотентных), выкинуты устаревшие шифры и RSA-обмен, зашифрована большая часть рукопожатия.
На практике TLS обычно терминируют на балансировщике или ingress; между сервисами — mTLS через service mesh. Сертификаты выпускают автоматически (Let's Encrypt, ACME) — срок жизни короткий.