Почему у набора много имён

Один набор шифров можно записать как минимум тремя способами, и различия сбивают с толку каждого, кто сравнивает конфигурацию сервера с захватом пакетов или отчётом сканера. Набор, который называет TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, — тот же, что OpenSSL называет ECDHE-RSA-AES128-GCM-SHA256. Они описывают одинаковые байты на линии, а именно кодовую точку 0xC02F.

Кодовая точка — единственное, что протокол действительно использует. Имена — это удобства для конфигурационных файлов, документации и людей, и каждая экосистема инструментов вырастила собственное соглашение.

Три соглашения

Code point: 0xC02F
IANA:       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
OpenSSL:    ECDHE-RSA-AES128-GCM-SHA256
GnuTLS:     TLS_ECDHE_RSA_AES_128_GCM_SHA256

Имя IANA — это стандарт реестра. Оно всегда начинается с TLS_, разделяет каждый токен подчёркиванием и использует слово WITH, чтобы отделить обмен ключами и аутентификацию от шифра и MAC.

Имя OpenSSL отбрасывает префикс TLS_, использует дефисы вместо подчёркиваний, удаляет WITH и пишет шифр и длину ключа одним токеном (AES128 вместо AES_128). Для наборов со статическим OpenSSL также отбрасывает избыточный токен обмена ключами, поэтому TLS_RSA_WITH_AES_128_CBC_SHA становится просто AES128-SHA. TLS 1.3 — исключение: там OpenSSL принял имена IANA без изменений, поэтому TLS_AES_128_GCM_SHA256 пишется одинаково в обоих.

Имя GnuTLS сохраняет префикс TLS_ и подчёркивания, но, как и OpenSSL, опускает WITH. Это наименее часто встречающееся из трёх.

Именно это несовпадение заставляет людей думать, будто две системы противоречат друг другу, хотя они настроили один и тот же набор. Декодер, принимающий любое из имён, а также сырую кодовую точку, устраняет догадки, показывая их все сразу.

Чтение кодовой точки

Кодовая точка набора шифров — это два байта, записываемые несколькими способами, означающими одно и то же число:

0x1301      0x13,0x01      13 01      1301

Первый байт группирует родственные наборы: блок 0x00xx вмещает исходные наборы TLS 1.0 и 1.1, 0xC0xx вмещает наборы на эллиптических кривых из RFC 5289 и родственных, 0xCCxx вмещает наборы ChaCha20-Poly1305, а 0x13xx вмещает наборы TLS 1.3. Увидеть 0xC0 или 0xCC в начале — быстрая подсказка, что вы смотрите на современный набор или ChaCha20.

Что означает столбец Recommended

В реестре IANA есть столбец Recommended с тремя значениями, и их легко прочитать неправильно.

Y означает, что набор прошёл процесс консенсуса и рекомендуется для общего применения на момент регистрации. N не означает, что набор неисправен; это значит, что он не прошёл этот процесс, имеет ограниченную применимость или предназначен для конкретной ниши. Наборы CCM_8 помечены N именно по этой причине: усечённый тег — это намеренный компромисс, а не изъян.

D — это сильное. Оно означает, что набор не советуется и не следует или нельзя использовать в зависимости от ситуации. Целые семейства перешли в D по мере того, как IETF выводит их из обращения, включая наборы со статическим RSA и, в последнее время, наборы DHE над конечным полем. Набор может быть криптографически прочным и всё же помеченным D по причинам экосистемы, и поэтому декодер показывает пометку IANA рядом с собственной оценкой безопасности, а не сливает их в единый вердикт. Они отвечают на разные вопросы: прочна ли конструкция и хочет ли процесс стандартизации, чтобы вы всё ещё её использовали?

Собираем всё вместе

Чтобы опознать неизвестный набор, вставьте имеющуюся у вас форму — имя IANA, имя OpenSSL или кодовую точку — в декодер. Он разрешает набор по встроенной копии реестра IANA, показывает остальные имена, разбивает набор на части и сочетает основанную на правилах оценку безопасности с официальной рекомендацией IANA. Сопутствующие статьи объясняют сами части: общую анатомию, выбор между и , прямую секретность и то, что изменил TLS 1.3.