TLS-PSK (pre-shared key)
Сертификаты требуют инфраструктуры ключей, памяти и верных часов. Когда клиентов и серверов немного и они настраиваются вручную, TLS может опираться на общий секрет, заранее записанный в обе стороны. Это и есть PSK — с оговорками про стойкость ключа и прямую секретность.
Обновлено Редакция GAW
TLS-PSK (pre-shared key, предварительно разделённый ключ) — способ аутентификации в TLS, при котором стороны доказывают друг другу знание общего симметричного секрета, записанного в обе стороны заранее, а не предъявляют сертификаты X.509. Для TLS 1.2 его описывает RFC 4279, в TLS 1.3 (RFC 8446) PSK встроен в протокол и служит также для возобновления сеансов.
Три варианта по RFC 4279
| Обмен ключами | Что аутентифицирует | Прямая секретность | Операции с открытым ключом |
|---|---|---|---|
| PSK | только общий секрет | нет | нет |
| DHE_PSK | PSK подтверждает обмен Диффи — Хеллмана | да, при свежем ключе на каждое рукопожатие | да |
| RSA_PSK | сертификат сервера RSA плюс PSK клиента | нет | да |
Чистый PSK использует только симметричные алгоритмы, и RFC 4279 (разд. 1) называет его подходящим для сред с ограниченным процессором. В рукопожатии клиент перечисляет наборы PSK в ClientHello, сервер выбирает один, а сообщения Certificate и CertificateRequest опускаются; клиент сообщает, каким ключом пользуется, строкой PSK identity в ClientKeyExchange, сервер может подсказать её в ServerKeyExchange. Из ключа длиной N байт собирается premaster secret: uint16 N, N нулей, uint16 N, сам ключ. Реализации обязаны принимать identity до 128 октетов и ключи до 64 октетов (разд. 5.3); identity передаётся открытым текстом (разд. 7.3).
PSK в TLS 1.3
RFC 8446 (разд. 2.2) различает внешний PSK, заданный заранее, и PSK, полученный в прошлом соединении через NewSessionTicket, — так устроено возобновление сеанса вместо session ID и session ticket прежних версий. Клиент присылает расширение pre_shared_key со списком identities и binders — значений HMAC, по одному на identity, которые сервер обязан проверить, — и обязательное psk_key_exchange_modes с режимами psk_ke (только PSK) и psk_dhe_ke (PSK вместе с (EC)DHE, что возвращает прямую секретность). Для внешнего PSK должны быть заданы identity и хеш KDF, по умолчанию SHA-256, а pre_shared_key обязано быть последним расширением ClientHello. Сервер, аутентифицируясь PSK, не шлёт Certificate и CertificateVerify.
Зачем на микроконтроллере и чем платят
Сертификат надо разобрать, проверить подпись цепочки и срок действия — для последнего нужны верные часы, — а корневые сертификаты занимают флеш. PSK — это десятки байт и симметричная криптография, которую ESP32 и многие другие контроллеры ускоряют аппаратно (AES, SHA). Поэтому PSK удобен для своего сервера MQTT или DTLS в закрытой системе, где каждое устройство получает собственный ключ при производстве.
Плата — два ограничения из разд. 7 RFC 4279. Во-первых, чистый PSK не даёт прямой секретности: компрометация ключа раскрывает и записанные ранее сеансы; лечится режимами DHE_PSK или psk_dhe_ke. Во-вторых, ключ малой энтропии — короткий или придуманный человеком — подбирается по перехваченному рукопожатию, и RFC 8446 прямо говорит, что пароль в роли PSK небезопасен. Ключ должен быть случайным, сгенерированным аппаратным ГСЧ, и уникальным для каждого устройства: один ключ на всю партию означает, что утечка из любого экземпляра открывает все.
В ESP-TLS режим включается CONFIG_ESP_TLS_PSK_VERIFICATION, а в esp_tls_cfg_t передаётся psk_hint_key — структура с ключом в двоичном виде, его длиной и строкой hint. Документация Espressif подчёркивает: выбирается ровно один способ проверки сервера, PSK применяется, только если не заданы ни сертификат CA, ни пакет корневых сертификатов, а без какого-либо способа соединение завершается фатальной ошибкой. Предустановка mbedTLS Minimal для ограниченных ресурсов оставляет только клиент TLS 1.2 с обменом RSA и PSK.
Частые вопросы
Зачем TLS-PSK, если есть сертификаты?
RFC 4279 называет две причины: наборы с чистым PSK обходятся без операций с открытым ключом, что важно при слабом процессоре, и ключ проще настроить вручную, чем разворачивать инфраструктуру сертификатов. Для микроконтроллера есть и третья: сертификат нужно проверять по сроку действия, а значит, нужны верные часы и хранилище корневых сертификатов, тогда как PSK — это несколько десятков байт во флеш. Сам RFC подчёркивает, что метод рассчитан на небольшое число заранее известных клиентов и серверов.
Чем платят за PSK?
Прямой секретностью и стойкостью к перебору. По RFC 4279 (разд. 7.1) наборы PSK и RSA_PSK её не дают: узнав ключ, противник расшифрует записанные ранее сеансы; её возвращает DHE_PSK, а в TLS 1.3 — режим psk_dhe_ke. По разд. 7.2 короткий или придуманный человеком ключ можно подобрать по перехваченному рукопожатию, RFC 8446 повторяет это для TLS 1.3: пароль как PSK небезопасен. Ключ должен быть случайным — на ESP32 его генерируют аппаратным ГСЧ — и одинаковым только у пары «устройство — сервер», а не у всей партии.
Как включить PSK в ESP-TLS?
Включить CONFIG_ESP_TLS_PSK_VERIFICATION в menuconfig и передать в esp_tls_cfg_t указатель psk_hint_key на структуру psk_key_hint: key — ключ в двоичном виде, key_size — его длина, hint — строка идентификатора. ESP-TLS использует PSK для проверки сервера, только если не задан ни один другой способ — ни cacert_buf, ни crt_bundle_attach, ни глобальное хранилище CA. Без какого-либо способа проверки соединение завершается фатальной ошибкой.
Источники
- IETF. RFC 4279 Pre-Shared Key Ciphersuites for Transport Layer Security (TLS). P. Eronen, H. Tschofenig, December 2005 — разд. 1: симметричные ключи, разделённые заранее, вместо сертификатов; две причины — отказ от операций с открытым ключом в средах с ограниченным процессором и удобство управления ключами в закрытых системах с ручной настройкой; три алгоритма обмена: PSK (только симметричные алгоритмы), DHE_PSK (PSK аутентифицирует обмен Диффи — Хеллмана, даёт PFS и защиту от словарных атак пассивным наблюдателем), RSA_PSK (сертификат сервера плюс PSK); разд. 1.1: предназначено для ограниченного набора приложений с небольшим числом клиентов и серверов, альтернатива — самоподписанные сертификаты с отпечатками ключей; разд. 2: клиент включает наборы PSK в ClientHello, сервер выбирает один, сообщения Certificate и CertificateRequest опускаются; PSK identity передаётся в ClientKeyExchange, подсказка — в ServerKeyExchange; premaster secret = uint16 N, N нулевых октетов, uint16 N, PSK; неизвестная identity — предупреждение unknown_psk_identity; разд. 5.1: identity — строка UTF-8; разд. 5.3: реализации обязаны поддерживать identity до 128 октетов и PSK до 64 октетов; разд. 7.1: наборы PSK и RSA_PSK не дают прямой секретности — при компрометации ключа старые сеансы расшифровываются, DHE_PSK даёт её при свежем ключе на каждое рукопожатие; разд. 7.2: короткий или придуманный человеком ключ допускает перебор по перехваченному рукопожатию; рекомендуется генерировать случайный PSK; разд. 7.3: identity передаётся открытым текстом
- IETF. RFC 8446 The Transport Layer Security (TLS) Protocol Version 1.3. E. Rescorla, August 2018 — разд. 2.2: PSK устанавливается заранее (out of band) или в предыдущем соединении (возобновление сеанса, заменяет session ID и session ticket TLS 1.2); сервер, аутентифицируясь PSK, не шлёт Certificate и CertificateVerify; PSK можно сочетать с (EC)DHE ради прямой секретности или использовать один, теряя её; для внешнего PSK обязаны быть заданы identity и хеш KDF; низкоэнтропийный секрет или пароль уязвим к словарной атаке через PSK binder; разд. 4.2.9: клиент обязан прислать psk_key_exchange_modes с режимами psk_ke (0, сервер не шлёт key_share) и psk_dhe_ke (1, обе стороны шлют key_share); разд. 4.2.11: расширение pre_shared_key — список identities и binders (значения HMAC по одному на identity), для внешнего PSK obfuscated_ticket_age = 0, хеш по умолчанию SHA-256; сервер обязан проверить binder, иначе прервать рукопожатие; pre_shared_key обязано быть последним расширением ClientHello
- Espressif. ESP-IDF Programming Guide v6.1, ESP32: ESP-TLS; Configuration Options Reference — разд. TLS Server Verification: клиент ESP-TLS проверяет сервер сертификатом либо с помощью PSK, выбирается только один вариант, без выбора — фатальная ошибка при установлении соединения; для PSK включают CONFIG_ESP_TLS_PSK_VERIFICATION и передают в esp_tls_cfg_t указатель psk_hint_key на структуру psk_key_hint с полями key (ключ в двоичном виде), key_size и hint (строка); PSK используется для проверки сервера только если не выбран другой вариант; Kconfig CONFIG_ESP_TLS_PSK_VERIFICATION — поддержка наборов с предварительно разделённым ключом для mbedTLS и пользовательских стеков; страница mbedTLS: предустановка Minimal для ограниченных ресурсов — только клиент TLS 1.2, обмен RSA и PSK, AES-128 CBC/CTR, базовый разбор X.509
Нашли ошибку? ·
Смотрите также
- TLSШифрованный канал поверх TCP: рукопожатие, сертификаты, буферы и время на МК
- Сертификат X.509Структура сертификата по RFC 5280, цепочка и якорь доверия, срок действия, проверка на МК
- HMACКод аутентификации сообщения на хеш-функции и общем ключе: формула, ключ, усечение, аппаратный блок
- DTLSВариант TLS для UDP: явные номера записей, фрагментация и повтор рукопожатия, cookie; используется с CoAP (coaps, порт 5684)
- MQTTПротокол издатель — подписчик через брокер: топики, QoS, retain, Last Will
- AES (Advanced Encryption Standard)Стандартный блочный шифр с блоком 128 бит и ключами 128, 192 или 256 бит
- Аппаратный генератор случайных чиселБлок микроконтроллера, который выдаёт случайные числа на основе физического шума
- ESP32ESP32, S2, S3, C2, C3, C5, C6, H2, P4: ядра, радио, USB, GPIO — сравнение и выбор