Перейти к содержанию

TLS

HTTPS, MQTT на порту 8883 и загрузка прошивки с сервера используют один и тот же слой — TLS. Для микроконтроллера это не только шифр, но и сертификаты в флеш, буферы в ОЗУ и правильное время.

Обновлено Редакция GAW

TLS (Transport Layer Security) — протокол защищённого канала поверх TCP: он шифрует данные, проверяет их целостность и подтверждает подлинность сервера сертификатом. На TLS держатся HTTPS, MQTT на порту 8883 и загрузка прошивки при обновлении по воздуху. Текущая версия — TLS 1.3 (RFC 8446); TLS 1.2 по-прежнему встречается, и ESP-TLS позволяет выбрать версию для каждого соединения.

Как устанавливается соединение

В TLS 1.3 полное рукопожатие занимает один обмен (1-RTT): клиент шлёт ClientHello с предложенными шифрами и ключевым материалом, сервер отвечает ServerHello, своим сертификатом и подписью, затем обе стороны подтверждают рукопожатие сообщениями Finished. После этого данные идут записями: открытый текст одной записи не длиннее 2^14 байт, зашифрованная запись — не длиннее 2^14 + 256 байт (RFC 8446, разд. 5). Обязательный для любой реализации набор шифров — TLS_AES_128_GCM_SHA256. Режим 0-RTT позволяет отправить данные сразу при повторном подключении, но RFC предупреждает, что такие данные не защищены от повторного воспроизведения.

Что нужно микроконтроллеру

  • Сертификат для проверки сервера. В ESP-TLS это сертификат CA в буфере или пакет корневых сертификатов из хранилища Mozilla: полный — больше 130 штук, сокращённый — около 38. Пакет встроен в прошивку, поэтому обновляется вместе с ней.
  • Память под записи. Входной буфер mbedTLS в ESP-IDF по умолчанию 16 384 байт — ровно 2^14, выходной 4096. Их можно уменьшить или выделять динамически, но входной буфер меньше реальной записи сервера ломает соединение.
  • Случайные числа. Ключи сессии генерируются из случайных данных, поэтому важен аппаратный генератор случайных чисел.
  • Время. Проверка срока действия сертификата в ESP-IDF по умолчанию выключена. Если её включить, часы надо выставить до первого соединения — Espressif рекомендует SNTP, подойдут и часы RTC с батарейкой.

Микросхемы с аппаратным стеком TCP/IP вроде W5500 TLS не выполняют — шифрование тогда ложится на микроконтроллер поверх сокета. Чтобы не повторять полное рукопожатие при каждом подключении, ESP-TLS умеет возобновлять сессию; в TLS 1.3 для этого служат билеты NewSessionTicket, которые сервер присылает после рукопожатия.

Отключённая проверка сертификата превращает TLS в шифрование «с неизвестным собеседником»: подменить сервер становится просто. Поэтому проверку оставляют включённой даже на отладочных прошивках, а список доверенных корневых сертификатов обновляют вместе с прошивкой.

Частые вопросы

Сколько памяти нужно TLS на микроконтроллере?

Основной расход — буферы записей. По RFC 8446 открытый текст одной записи TLS достигает 2^14 = 16 384 байт, поэтому в ESP-IDF входной буфер mbedTLS по умолчанию 16 384 байт, выходной — 4096. Входной можно уменьшить до 512 байт, но только если сервер не пришлёт запись больше этого размера. Опция CONFIG_MBEDTLS_DYNAMIC_BUFFER выделяет буферы лишь на время обмена.

Зачем устройству с TLS точное время?

Чтобы проверить срок действия сертификата. В ESP-IDF эта проверка по умолчанию выключена: поля «valid from» и «valid to» игнорируются. Если включить CONFIG_MBEDTLS_HAVE_TIME_DATE, системные часы надо выставить до первого соединения — Espressif рекомендует SNTP, — иначе проверка вернёт ошибку «сертификат ещё не действителен» или «истёк».

Можно ли отключить проверку сертификата сервера?

Технически можно, но тогда шифрование не защищает от подмены сервера: устройство установит зашифрованный канал с кем угодно. Проверяйте сервер по сертификату CA в прошивке или по пакету корневых сертификатов, как это делает ESP-TLS с crt_bundle_attach, и обновляйте пакет вместе с прошивкой.

Источники

  1. IETF. RFC 8446 The Transport Layer Security (TLS) Protocol Version 1.3 (August 2018) — разд. 1.2: добавлен режим 0-RTT; разд. 2: полное рукопожатие ClientHello → ServerHello … Finished за один обмен (1-RTT), сервер аутентифицируется сертификатом; разд. 2.3: у данных 0-RTT слабее защита, нет защиты от повторного воспроизведения; разд. 5.1: длина TLSPlaintext.fragment не более 2^14 байт; разд. 5.2: длина TLSCiphertext не более 2^14 + 256 байт; разд. 9.1: обязательный набор шифров TLS_AES_128_GCM_SHA256
  2. Espressif. ESP-IDF Programming Guide v6.1, ESP32: ESP-TLS — ESP-TLS по умолчанию использует MbedTLS; сертификат CA для проверки сервера — буфер cacert_buf и длина cacert_bytes, или пакет корневых сертификатов crt_bundle_attach; возобновление сессии клиента, в TLS 1.3 — только билетами NewSessionTicket; выбор версии TLS 1.2 или 1.3 на соединение
  3. Espressif. ESP-IDF Programming Guide v6.1, ESP32: ESP x509 Certificate Bundle — пакет корневых сертификатов из хранилища Mozilla NSS: полный — более 130 сертификатов, сокращённый — около 38 самых распространённых (≈ 93 % охвата по использованию); пакет встраивается в прошивку и обновляется вместе с ней по OTA
  4. Espressif. ESP-IDF Programming Guide v6.1, ESP32: Configuration Options Reference (mbedTLS) — CONFIG_MBEDTLS_HAVE_TIME_DATE: по умолчанию выключено, и поля «valid from» и «valid to» сертификата не проверяются; при включении время берётся из time() и нужно заранее выставить системные часы, рекомендуется SNTP; CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN — 512–16 384 байт, по умолчанию 16 384; CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN — 512–16 384, по умолчанию 4096; CONFIG_MBEDTLS_DYNAMIC_BUFFER — буферы приёма и передачи выделяются только на время обмена

Нашли ошибку?