ESP32: лучший способ встраивания сертификатов

Я использую фреймворк Arduino на плате на базе ESP32. На плате есть слот для SD-карт, но я не собираюсь им пользоваться.

В любом случае, мне нужно где-то хранить сертификаты. Что касается прошивки, я только что жестко закодировал их в код:

const char *rootCABuff = \
"-----BEGIN CERTIFICATE-----\n" \
"MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB\n" \
...
"hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\n" \
"-----END CERTIFICATE-----\n";

const char certificateBuff[] = \
"-----BEGIN CERTIFICATE-----\n" \
"MIIDWTCCAkGgAwIBAgIUZXjPNnJFXMntXOki9BT+QmDFciUwDQYJKoZIhvcNAQEL\n" \
...
"gGXtqlgPnenkZPTaBr9c8o+WjgQXFLM+Jwnw3/53dUI9zBcybTaptI63o3Ct\n" \
"-----END CERTIFICATE-----\n";

const char privateKeyBuff[] = \
"-----BEGIN RSA PRIVATE KEY-----\n" \
"MIIEpAIBAAKCAQEAuuKsFy98/xsJclnWo0d+qm8KImLEILB64BbH7WaYi3NnznLg\n" \
...
"uHfBLQQDrA0HDRvYpAUNw/b2H4dpUK/nGM4FFVMP7V8RM2t2923nhQ==\n" \
"-----END RSA PRIVATE KEY-----\n";

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

Очевидно, что идея заключается во flash. Поэтому я попытался улучшить свой класс настроек, основываясь на библиотеке настроек. В официальном документея читаю:

Строковые значения в настоящее время ограничены 4000 байтами. Это включает в себя нулевой терминатор. Значения больших двоичных объектов ограничены 508000 байтами или 97,6% от размера раздела - 4000 байт, в зависимости от того, что меньше.

Но если я сделаю что-то вроде этого:

Preferences prefs;
prefs.begin("settings", false);
Serial.println(prefs.freeEntries());

он возвращает 460, даже если у меня все еще много flash:

Flash: [=======   ]  73.8% (used 967234 bytes from 1310720 bytes)

Есть ли другая библиотека, более подходящая для хранения таких данных, которые можно использовать с предпочтениями?

, 👍1

Обсуждение

Привет, приятель, вы также можете использовать память spiffs, проверьте здесь, это может вам помочь: https://diyprojects.io/esp32-get-started-spiff-library-read-write-modify-files/, @k.Cyborg

Я не знаю этих библиотек, но "freeEntries" не выглядит как нечто, что возвращает размер в байтах. Похоже, он говорит вам, сколько еще значений вы можете сохранить. (Аналогично максимальному количеству файлов, имеющихся в некоторых файловых системах, а не общему доступному свободному пространству.), @Mat

Вам не нужна никакая библиотека. Сколько сертификатов вы собираетесь хранить? Для ESP32 любая переменная, объявленная как const, хранится во флэш-памяти, и внутренне ей не нужно копировать данные с флэш-памяти в оперативную память, но она использует Flash MMU для отображения сегментов памяти либо в IRAM, либо в обычную оперативную память, поэтому она не занимает вашу оперативную память ESP32. В качестве альтернативы вы могли бы сохранить его в SPIFFS или FS в виде файла., @hcheung

@hcheung Извини, что я неправильно объяснил. Мне нужно хранить только эти сертификаты. Проблема в том, что я не могу менять код каждый раз, когда программирую новую плату! Поэтому я собираюсь "загрузить" данные по последовательной линии и сохранить их во флэш-памяти во время выполнения., @Mark

@Мэт, понял. Я собираюсь попробовать посмотреть, смогу ли я действительно сохранить их, как и другие мои предпочтения., @Mark

@k.Cyborg, хороший совет. Я попробую "spiffs", надеясь, что его можно будет использовать вместе с другими вещами., @Mark


1 ответ


Лучший ответ:

3

Я не знаю, для чего вам нужны эти настройки, но я бы все равно использовал SPIFFS / FAT. Просто сохраните сертификат в файле во flash и прочитайте этот файл, когда он вам понадобится. Требуемое пространство не проблема, так как вы можете выбрать размер файловой системы в таблице разделов, а также загрузить файл (для этого в arduino IDE есть плагин) после прошивки прошивки, поэтому наличие разных сертификатов на отдельных устройствах не является проблемой.

Я видел, что вы пометили вопрос "eeprom": esp не имеет eeprom, но эмулирует его с помощью blob-объекта во flash, поэтому использование любой библиотеки flash так же хорошо. Esp также поддерживает выравнивание износа, что делает использование flash еще лучшим вариантом, поскольку выделенный раздел eeprom, который использовался в более старой версии sdk, изнашивался или изнашивался. "eeprom" предназначен только для того, чтобы быть совместимым с использованием других eeprom от arduino.

,

Да, я только что попробовал, и это очень удобно! Просто уточнение: я использую PlatformIO внутри кода Visual Studio, и я только нашел способ поместить нужные файлы в папку данные для загрузки. Есть ли что-то лучше? Потому что мне нужно будет заменить файлы для каждого устройства..., @Mark

Вы можете использовать простые функции sdk, в том числе инструменты mkspiffs и esptool.py чтобы создать двоичный файл flash и загрузить его. Посмотрите на этот ансер: https://arduinoprosto.ru/q/51581/38721, @Sim Son