IoT
TLS
AWS

ESP32: TLS (безопасность транспортного уровня) и устройства IoT

TLS соединение между устройством и сервером гарантирует, что обмен данными между ними защищен от множества возможных угроз на ненадежном носителе. Соединение TLS обычно включает взаимную аутентификацию взаимодействующих сторон, безопасный обмен ключами, симметричное шифрование и проверку целостности сообщений. В статье раскрываются особенности использования контроллера ESP-32 при обмене данными по протоколу https и описываются возможные проблемы при отладке приложения.
3769
В избранное

TLS (transport layer security) - это компонент безопасности в привычном протоколе https, который используется для обеспечения безопасности в Интернете. TLS соединение между устройством и сервером гарантирует, что обмен данными между ними защищен от множества возможных угроз на ненадежном носителе. Соединение TLS обычно включает взаимную аутентификацию взаимодействующих сторон, безопасный обмен ключами, симметричное шифрование и проверку целостности сообщений.

TLS (transport layer security)

Рис1. TLS соединение между устройством и удаленным сервером

Как рекомендация, весь обмен данными между устройством и удаленным сервером (облаком) должен использовать TLS. Хотя протокол TLS позаботится обо всех элементах, участвующих в безопасной связи, разработчик и производитель устройств должны обратить внимание на несколько моментов при использовании этого протокола.

Сертификаты CA (проверка сервера)

Протокол TLS использует сертификат CA ( certificate authorities) для проверки того, что сервер действительно является тем, за кого он себя выдает. Скажем, ваше устройство должно отправлять данные на aws.amazon.com, сертификат CA гарантирует, что вы действительно общаетесь с aws.amazon.com, а не с кем-то, кто имитирует с помощью подмены DNS этот сервер.

Во время установления сеанса TLS сервер представляет свой сертификат устройству. Одной из частей информации, закодированной в этом сертификате, является доменное имя сервера (aws.amazon.com). Сертификат сервера должен быть подписан доверенным центром сертификации. Корневой сертификат CA (отличный от сертификата сервера), присутствующий на устройстве, помогает проверить эту подпись. Если подпись действительна, то и сертификат сервера действителен и, следовательно, доменное имя, закодированное в сертификате, является действительным. Далее, протокол TLS гарантирует, что это доменное имя в сертификате соответствует имени домена, к которому мы подключились.

Проверка сертификата сервера во время инициализации TLS

Рис. 2. Проверка сертификата сервера во время инициализации TLS

Соединение TLS обычно ожидает, что сохраненный на устройстве сертификат CA будет передан ему в качестве параметра установления сеанса. Например, в ESP-IDF за это отвечает параметр cacert_pem_buf в структуре esp_tls_cfg_t.

>esp_tls_cfg_t cfg = {
  .cacert_pem_buf = server_root_cert_pem_start,
  .cacert_pem_bytes = server_root_cert_pem_end -
               server_root_cert_pem_start,
};
struct esp_tls *tls = esp_tls_conn_http_new (
  "https://aws.amazon.com", &cfg);

В приведенном выше коде server_root_cert_pem_start указывает на начало сертификата CA, встроенного в прошивку устройства.

Если сертификат не будет указан, то и проверка сертификата сервера будет пропущена.

Получение корневого сертификата CA

Если ваш сервер размещен в облачной инфраструктуре и поддерживает https, то у него уже есть сертификат, подписанный каким-то центром сертификации. В этом случае вы можете получить сертификат CA вашего сервера, используя следующую команду:

$ openssl s_client -showcerts -connect {имя хоста}:443

Команда получает список сертификатов. Нижний из полученных сертификатов - это сертификат CA, который должен быть встроен в прошивку устройства.

Самоподписанные сертификаты

Обычно серверные сертификаты подписываются центром сертификации, таким как Verisign. Но у вас также есть возможность использовать свою собственную пару ключ-сертификат для подписи сертификата сервера. Это называется самоподписанный сертификат.

У вас могут быть причины для использования такого сертификата (например, ваш провайдер взимает плату за сертификаты с вашим собственным доменным именем, вы хотите полностью контролировать свою инфраструктуру и т. д.), но вам нужно обратить внимание на следующие моменты:

  • Ответственность за безопасность закрытого ключа будет лежать на вас
  • Самоподписанные сертификаты будут работать, пока клиент (в данном случае ваше устройство) находится под вашим контролем, и у вас есть возможность установить свой корневой сертификат в качестве сертификата CA на клиенте. Но, например, большинство веб-браузеров пометят сервер с самоподписанным сертификатом как угрозу безопасности, поскольку в браузерах не установлен ваш сертификат в качестве доверенного сертификата CA.

Обновление сертификатов на устройстве

Если в вашей прошивке предусмотрен сертификат CA, вы обязательно должны иметь возможность его обновления при необходимости. Как правило, вам может потребоваться обновить сертификат CA в следующих случаях:

  • при смене облачного провайдера или доменного имени
  • если провайдер мигрирует в другой центр сертификации
  • если срок действия сертификата CA истекает

То есть, если сертификат CA встроен в прошивку устройства, вы можете обновить сертификаты CA, выполнив OTA обновление прошивки. Новая прошивка должна содержать обновленный сертификат CA, который и будет использоваться в дальнейшем.

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

В приведенном выше примере API ESP-TLS cacert_pem_buf может указывать на буфер, который содержит несколько сертификатов CA один за другим. Модуль TLS в этом случае попытается проверить сертификат сервера, используя любой из доверенных сертификатов CA из этого буфера.

Проблемы при использовании TLS

  1. Требование к памяти

Каждый сеанс TLS требует некоторого количества памяти. У контроллера должно быть достаточно свободной памяти во время работы TLS. Обычно для одного сеанса требуется примерно 5–6 КБ стека и около 33–35 КБ может быть выделено из кучи. Всегда контролируйте достаточность места в куче во время сеанса TLS.

  1. Шифронаборы

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

Если ваше соединение TLS прерывается из-за несовпадения шифров, вам, возможно, придется добавить эти конкретные шифры в конфигурации SDK. Это можно сделать следующим образом:

make menuconfig --> Component configuration --> mbedTLS -->

И затем выбрать отсутствующие шифры

Обратите внимание, что включение/ отключение комплектов шифров в конфигурации SDK будет оказывать влияние на статическую и динамическую память.

  1. Выявление проблем с сертификатами

Вполне вероятно, что после развертывания сертификата CA для проверки может произойти сбой в процессе TLS handshake. Обычно это случается из-за ошибки в проверке сертификата, например, если был выбран неправильный корневой сертификат CA. Дополнительную информацию о точной причине сбоя можно узнать с помощью следующего кода:

int flags = mbedtls_ssl_get_verify_result(&tls->ssl);
char buf[100] = { 0, };
mbedtls_x509_crt_verify_info(buf, sizeof(buf), " ! ", flags);
printf("Certificate Verification Failure Reason: %s\n", buf);

Производитель: Espressif Systems (shanghai) Pte. Ltd.
Наименование
Производитель
Описание Корпус/
Изображение
Цена, руб. Наличие
ESP32-WROOM-32 [4MB]
ESP32-WROOM-32 [4MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2292549 ИНФО PDF RND DT
Доступно: 2112 шт. 287,00
Базовый модуль, использующий высокопроизводительную микросхему ESP32-D0WDQ6 с двухъядерным процессором и максимальной рабочей частотой до 240 МГц. Микросхема ESP32-D0WDQ6 работает под управлением freeRTOS и использует стек LwIP, ESP32-D0WDQ6, 32Mbits SPI flash, UART Mode
ESP32-WROOM-32 [4MB] 287,00 от 3 шт. 281,00 от 15 шт. 260,00 от 30 шт. 251,00 от 61 шт. 240,00
2112 шт.
(на складе)
ESP32-WROVER-I [4MB]
ESP32-WROVER-I [4MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2610278 ИНФО PDF
Поиск
предложений
ESP32-WROVER-I [4MB] - SMD Module ESP32-WROVER, ESP32-D0WDQ6, 1.8V 64Mbits PSRAM, 32Mbits SPI flash, IPEX Antenna connector
ESP32-WROVER-I [4MB]
-
Поиск
предложений
ESP32-WROVER [4MB]
ESP32-WROVER [4MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2738673 ИНФО PDF RND
Поиск
предложений
ESP32-WROVER - мощный высокопроизводительный модуль общего назначения со встроенным микроконтроллерным ядром и с поддержкой стандартов связи Wi-Fi+BT+BLE, предназначенный для широкого ряда приложений с экономичным энергопотреблением.
ESP32-WROVER [4MB]
-
Поиск
предложений
ESP32-S0WD
ESP32-S0WD
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739124 ИНФО PDF RND
Поиск
предложений
Система-на-кристалле (SoC) на базе 32-битного процессора Xtensa® 160 МГц 200 DMIPS
ESP32-S0WD
-
Поиск
предложений
ESP32-D0WD
ESP32-D0WD
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739127 ИНФО PDF RND DT
Доступно: 6032 шт. 185,00
Система-на-кристалле (SoC) на базе вухъядерного 32-битного процессора Xtensa® 240 МГц 600 DMIPS
ESP32-D0WD 185,00 от 5 шт. 181,00 от 22 шт. 168,00 от 46 шт. 162,00 от 95 шт. 154,00
99 шт.
(на складе)
5933 шт.
(под заказ)
ESP32-WROOM-32U [4MB]
ESP32-WROOM-32U [4MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739131 ИНФО PDF RND DT
Доступно: 3331 шт. 295,00
SMD Module ESP32-WROOM-32U, ESP32-D0WD, 32Mbits SPI flash, UART mode, U.FL antenna connector
ESP32-WROOM-32U [4MB] 295,00 от 3 шт. 289,00 от 14 шт. 268,00 от 29 шт. 258,00 от 60 шт. 246,00
793 шт.
(на складе)
2538 шт.
(под заказ)
ESP32-SOLO-1
ESP32-SOLO-1
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739132 ИНФО PDF RND DT
Доступно: 2231 шт. 330,00
Wi-Fi+BT+BLE-модуль, построенный на базе одноядерной микросхемы ESP32-S0WD. Как отмечалось выше, ESP32-S0WD – младший представитель семейства ESP32. Несмотря на это, ESP32-SOLO-1 может применяться в широком спектре приложений – от малопотребляющих датчиков (наиболее оптимальный вариант), до приложений с беспроводной передачей звука, ESP32-S0WD, Single Core, 32Mbits SPI flash, UART Mode
ESP32-SOLO-1 330,00 от 3 шт. 323,00 от 13 шт. 299,00 от 26 шт. 289,00 от 54 шт. 275,00
321 шт.
(на складе)
1910 шт.
(под заказ)
ESP32-PICO-D4
ESP32-PICO-D4
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 2739133 ИНФО PDF RND DT
Доступно: 5894 шт. 327,00
SIP module ESP32 with 4MByte Flash, Dual Core MCU, Wi-Fi & Bluetooth Combo, LGA48-pin, 7*7mm
ESP32-PICO-D4 327,00 от 3 шт. 321,00 от 13 шт. 297,00 от 26 шт. 287,00 от 54 шт. 273,00
2312 шт.
(на складе)
3582 шт.
(под заказ)
ESP32-WROOM-32 [8MB]
ESP32-WROOM-32 [8MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 3045527 ИНФО PDF
Поиск
предложений
SMD Module ESP32-WROOM-32, ESP32-D0WDQ6, 64Mbits SPI flash, UART mode
ESP32-WROOM-32 [8MB]
-
Поиск
предложений
ESP32-WROOM-32 [16MB]
ESP32-WROOM-32 [16MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 3045528 ИНФО PDF
Поиск
предложений
Базовый модуль, использующий высокопроизводительную микросхему ESP32-D0WDQ6 с двухъядерным процессором и максимальной рабочей частотой до 240 МГц. Микросхема ESP32-D0WDQ6 работает под управлением freeRTOS и использует стек LwIP, ESP32-D0WDQ6, 128Mbits SPI flash, UART mode
ESP32-WROOM-32 [16MB]
-
Поиск
предложений
ESP32-WROVER-B [16MB]
ESP32-WROVER-B [16MB]
Espressif Systems (shanghai) Pte. Ltd.
Арт.: 3045826 ИНФО PDF
Поиск
предложений
SMD module, ESP32-D0WD, 3.3 V, 8 MB PSRAM, 16 MB SPI ash, PCB antenna
ESP32-WROVER-B [16MB]
-
Поиск
предложений

Сравнение позиций

  • ()