تأمين إطار ESP32 المصمم مع التحديث عبر الهواء (OTA) ، تشفير الفلاش ، التحقق من شركة FirmWare ، MQTT والتخزين غير المتطابق. يمكن استخدامه لجميع أنواع مشاريع تطوير إنترنت الأشياء ، والتي تعتبر قاعدة آمنة. لهذا المشروع ، يتم استخدام ESP-Woom-32.
يتوفر شرح كامل لتثبيت ESP-IDF لنظام التشغيل Windows Linux و Mac على دليل تثبيت Espressif خطوة بخطوة. في هذا المشروع ، تم اتباع مسار Linux مع Ubuntu و Debian:
المتطلبات الأساسية:
sudo apt-get install git wget flex bison gperf python3 python3-pip python3-setuptools cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0
تنزيل وتثبيت:
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
cd ~/esp/esp-idf
./install.sh
استخدم ESP-IDF (يحتاج إلى تنفيذ في كل مرة يتم فيها إطلاق قذيفة جديدة):
. ~/esp/esp-idf/export.sh
قم بإنشاء مجلد للمشروع وقم بتنزيل إطار ESP32 من GIT:
cd ~/esp
git clone https://github.com/flouflouit/secure_esp
قائمة قصيرة بالأوامر الضرورية لهذا المشروع. كلهم يجب تنفيذها في مجلد مشروع الجذر secure_esp .
تم تكوين SSID وكلمة المرور الخاصة بـ WiFi في idf.py menuconfig ضمن Example Connection Configuration أو مباشرة في SDKConfig:
CONFIG_EXAMPLE_WIFI_SSID=""
CONFIG_EXAMPLE_WIFI_PASSWORD=""

بالنسبة لخادم التحديث ، يجب إنشاء شهادات وسيط MQTT. لذلك ، تم تنفيذ برنامج Certificate_creation.sh bash. إذا تم تنفيذ هذا البرنامج النصي على وسيط MQTT ، فيمكن نسخ شهادات MQTT مباشرة إلى مجلد البعوض. يجب أن يحتوي متغير IP على امتصاص IP لخادم Update و MQTT Broker ، والذي يجب تحريره في البرنامج النصي.
. ~/esp/secure_esp/certificate_creation.sh
يولد هذا البرنامج النصي بنية الشجرة التالية:

علاوة على ذلك ، يقوم البرنامج النصي أيضًا بنسخ المفاتيح والشهادات إلى مجلد مشروع ota_certs و mqtt_certs .
تحتاج عملية توقيع البرنامج الثابت إلى مفتاح توقيع. يتم إنشاء مفتاح sigining هذا باستخدام OpenSSL الذي يجب تنفيذه في مجلد مشروع الجذر secure_esp :
openssl ecparam -name prime256v1 -genkey -noout -out ~/esp/secure_esp/secure_boot_signing_key.pem
تثبيت وسيط البعوض ، والذي يتم على خادم Ubuntu 20.04 LTS:
sudo apt-get install mosquitto
تثبيت عميل البعوض:
sudo apt-get install mosquitto-clients
بعد تثبيت وسيط البعوض ، يجب إنشاء ملف جديد باسم secure.conf في المجلد: /etc/mosquitto/conf.d يجب أن يحتوي هذا الملف على المعلومات التالية:
listener 8883
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
require_certificate true
use_identity_as_username true
انسخ الشهادات ca.crt و server.crt و server.key ، التي تم إنشاؤها باستخدام certificate_creation.sh ، إلى/etc/mosquitto/certs/folder.
بعد ذلك ، يجب إعادة تشغيل الوسيط:
sudo systemctl restart mosquitto.service
يمكن اختبار الوسيط من خلال الاشتراك في موضوع ونشر رسالة إلى هذا الموضوع. يجب تغيير IP إلى IP Adress للوسيط.
mosquitto_sub -h $IP -t "/test" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt
mosquitto_pub -h $IP -t "/test" -m "test-message" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt
CESTURET_CREATION.SH ينشئ المجلدات MQTT_CERTS و OTA_CERTS. في هذه المجلدات ، يتم نسخ الشهادات ومفاتيح التحديث وخادم MQTT تلقائيًا من دليل CA الذي تم إنشاؤه. بعد ذلك ، يجب تكوين IP لوساطة MQTT في الكود المصدري للملف mqtt.c :

نستخدم MQTTS و PORT 8883 لاتصال آمن عبر TLS.
/esp/update/url - نشر الموضوع
mosquitto_pub -h $IP -t "/esp/update/url" -m "https://domain.de:8070/secure_esp.bin" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/esp/update/use_url - نشر الموضوع
mosquitto_pub -h $IP -t "/esp/update/use_url" -m "1" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/esp/update/vertal - نشر الموضوع
mosquitto_pub -h $IP -t "/esp/update/interval" -m "10000" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/esp/update/run - publish topic
mosquitto_pub -h $IP -t "/esp/update/run" -m "" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/ESP/RESTART - نشر الموضوع
mosquitto_pub -h $IP -t "/esp/restart" -m "" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/esp/log - موضوع الاشتراك
mosquitto_sub -h $IP -t "/esp/log" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt يجب أن يكون إصدار البرامج الثابتة التحديث أعلى من إصدار البرنامج الثابت. هذا هو السبب في حاجة إلى زيادة رقم الإصدار في ملف SDKConfig ضمن CONFIG_APP_PROJECT_VER قبل إنشاء المشروع لتحديث OTA. بدلاً من ذلك ، يمكن القيام به بواسطة idf.py menuconfig تحت مدير التطبيق: 
يمكن تغيير عنوان URL لترقية البرامج الثابتة في idf.py menuconfig ضمن تكوين المثال أو dircetly في ملف SDKConfig: CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL

أثناء عملية الإنشاء ، يتم توقيع البرامج الثابتة رقميًا مع Secure_Boot_signing_key.pem:
idf.py build
بعد تنفيذ هذا الأمر ~/esp/secure_esp/build/secure_esp.bin يمكن الاطلاع
إذا لم يتم ذلك بالفعل ، قم بإنشاء ملفات update_cert.pem و update_cert.pem باستخدام البرنامج النصي Comperation_Creation.sh.
بعد ذلك ، يجب نسخ هذه الملفات في مجلد واحد مع ثنائي البرامج الثابتة. لبدء خادم التحديث ، يتم استخدام الأمر التالي:
openssl s_server -WWW -key update_key.pem -cert update_cert.pem -port 8070
لترميز تطبيق هذا المشروع ، يتم تضمين تطبيق Blink في الكود. يمكن العثور على تطبيق المثال هذا الملف secure_esp.c . سيتم تنفيذها من خلال العملية الرئيسية ويعمل في حلقة لا نهاية لها. بالنسبة إلى مثال وميض ، يتم تعريف LED على GPIO PIN 9. يتم إيقاف تشغيله ومرة أخرى بعد ثانية واحدة. يوضح هذا المثال كيفية تضمين تطبيق أساسي للتأمين:

في هذا المشروع ، يتم تمكين incryption. يجب أن يتم الفلاش الأولي باستخدام أمر فلاش العادي:
idf.py -p [port] flash monitor
بعد ذلك ، لا يمكن وميض ESP32 إلا باستخدام أمر الفلاش المشفر:
idf.py -p [port] encrypted-flash monitor
في حالة حدوث رسالة خطأ تتبع ، يكون من المفيد الضغط على زر التمهيد على ESP32 أثناء وميضه:
