Иной вид набора
TLS 1.3, определённый в RFC 8446, изменил то, что обозначает набор шифров. В TLS 1.2 набор объединял обмен ключами, аутентификацию, шифр и MAC. В TLS 1.3 набор обозначает только две вещи: шифр и хеш-функцию, используемую функцией вывода ключей.
TLS_AES_128_GCM_SHA256
| |
| +-- handshake hash (HKDF): SHA-256
+------------- AEAD cipher: AES-128-GCM
В имени нет обмена ключами и нет аутентификации, потому что TLS 1.3 согласует их отдельно. Это самое большое изменение, и поэтому набор TLS 1.3 выглядит таким коротким рядом с набором TLS 1.2.
Куда делся обмен ключами
В TLS 1.3 обмен ключами несёт собственное расширение key_share, а предлагаемые группы перечислены в supported_groups. Аутентификация согласуется через signature_algorithms. Вынос этого из набора даёт реальное преимущество: горстка наборов шифров свободно сочетается с любой поддерживаемой группой и любым алгоритмом подписи вместо комбинаторного взрыва, давшего TLS 1.2 сотни зарегистрированных наборов.
Это также закрепляет два хороших значения по умолчанию. Каждый обмен ключами в TLS 1.3 эфемерен, поэтому прямая секретность обязательна, а не опциональна. А статический транспорт ключа , классический способ потерять прямую секретность, удалён полностью; RSA выживает лишь как алгоритм подписи для аутентификации.
Пять наборов
Базовая спецификация определяет пять наборов, а на практике вы увидите в основном три первых:
0x1301 TLS_AES_128_GCM_SHA256 (mandatory to implement)
0x1302 TLS_AES_256_GCM_SHA384
0x1303 TLS_CHACHA20_POLY1305_SHA256
0x1304 TLS_AES_128_CCM_SHA256
0x1305 TLS_AES_128_CCM_8_SHA256
Все пять — AEAD; TLS 1.3 не допускает ничего другого. TLS_AES_128_GCM_SHA256 обязателен к реализации, что делает его безопасным общим знаменателем. ChaCha20-Poly1305 — обычный выбор на оборудовании без аппаратного ускорения . Два набора нацелены на ограниченные среды, а CCM_8 обменивает более короткий тег аутентификации на меньшие накладные расходы, и поэтому не помечает его как рекомендуемый, хотя это набор TLS 1.3.
Тот же реестр, но не взаимозаменяемы
TLS 1.3 повторно использует тот же реестр наборов шифров IANA и то же двухбайтовое пространство кодов, что и более ранние версии, но эти два определения не взаимозаменяемы. Значение набора TLS 1.3 нельзя использовать с TLS 1.2, а значение набора TLS 1.2 нельзя использовать с TLS 1.3. Кодовые точки по случайности лежат в ранее не использовавшейся части диапазона (0x13xx), что сохраняет их визуально различимыми.
Поэтому декодер должен знать, к какому миру принадлежит набор. Имя без токена WITH в диапазоне 0x13xx — это набор TLS 1.3, обмен ключами которого согласуется в другом месте; имя с токеном WITH — это набор для TLS 1.2 и более ранних, обмен ключами которого выписан явно.
Защита от понижения версии
Поскольку более старые наборы всё ещё существуют для более старых партнёров, TLS 1.3 добавляет защиту от того, что злоумышленник принудит к понижению версии. Сервер, поддерживающий TLS 1.3, но в итоге согласовавший более старую версию, записывает фиксированное контрольное значение в последние восемь байт своего server random. Настоящий клиент TLS 1.3 проверяет это контрольное значение и прерывает соединение, если оно появляется там, где должна была быть 1.3, превращая тихое понижение в неудавшееся рукопожатие. Список наборов шифров сократился, но протокол вокруг него стал более оборонительным.
Чтобы увидеть всё это на реальном соединении, The Illustrated TLS 1.3 Connection аннотирует каждый байт настоящего handshake TLS 1.3 — запись за записью, поле за полем.