เฟรมเวิร์ก ESP32 ที่ได้รับการออกแบบอย่างปลอดภัยพร้อม Update Over The Air (OTA), การเข้ารหัสแฟลช, การตรวจสอบ FirmeWare ที่ลงนาม, MQTT และที่เก็บข้อมูลที่ไม่ระเหย สามารถใช้สำหรับโครงการพัฒนา IoT ทุกประเภทซึ่งพิจารณาฐานที่ปลอดภัย สำหรับโครงการนี้มีการใช้ ESP-Wroom-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
สร้างโฟลเดอร์สำหรับโครงการและดาวน์โหลด Framework 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 จะต้องถูกสร้างขึ้น ดังนั้นจึงมีการใช้สคริปต์ bash certificate_creation.sh หากสคริปต์นี้ดำเนินการบนนายหน้า MQTT ใบรับรอง MQTT สามารถคัดลอกโดยตรงไปยังโฟลเดอร์ Mosquitto ตัวแปร IP จะต้องมีที่อยู่ IP ของเซิร์ฟเวอร์อัปเดตและนายหน้า MQTT ซึ่งจำเป็นต้องแก้ไขในสคริปต์
. ~/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
การติดตั้งนายหน้า Mosquitto ซึ่งทำบน Ubuntu Server 20.04 LTS:
sudo apt-get install mosquitto
การติดตั้งไคลเอนต์ Mosquitto:
sudo apt-get install mosquitto-clients
หลังจากติดตั้งนายหน้า Mosquitto ไฟล์ใหม่ชื่อ 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/โฟลเดอร์
หลังจากนั้นนายหน้าจะต้องเริ่มต้นใหม่:
sudo systemctl restart mosquitto.service
นายหน้าสามารถทดสอบได้ด้วยการสมัครรับหัวข้อและเผยแพร่ข้อความไปยังหัวข้อนี้ IP จะต้องเปลี่ยนเป็นที่อยู่ IP ของนายหน้า
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
ใบรับรอง _creation.sh สร้างโฟลเดอร์ mqtt_certs และ ota_certs ในโฟลเดอร์เหล่านี้ใบรับรองและคีย์สำหรับการอัปเดตและเซิร์ฟเวอร์ MQTT จะถูกคัดลอกโดยอัตโนมัติจากไดเรกทอรี CA ที่สร้างขึ้น หลังจากนั้นจะต้องกำหนดค่าที่อยู่ IP ของนายหน้า MQTT ในซอร์สโค้ดของไฟล์ mqtt.c :

เราใช้ MQTTS และพอร์ต 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/Interval - เผยแพร่หัวข้อ
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 - เผยแพร่หัวข้อ
mosquitto_pub -h $IP -t "/esp/update/run" -m "" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/esp/retart - เผยแพร่หัวข้อ
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 ภายใต้ Application Manager: 
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 ด้วยสคริปต์ certificate_creation.sh
หลังจากนั้นไฟล์เหล่านี้จะต้องถูกคัดลอกในโฟลเดอร์เดียวพร้อมไบนารีของเฟิร์มแวร์ ในการเริ่มต้นเซิร์ฟเวอร์อัพเดทใช้คำสั่งต่อไปนี้:
openssl s_server -WWW -key update_key.pem -cert update_cert.pem -port 8070
สำหรับการเข้ารหัสแอปพลิเคชันสำหรับโครงการนี้ตัวอย่างแอปพลิเคชัน Blink จะรวมอยู่ในรหัส แอปพลิเคชันตัวอย่างนี้สามารถพบไฟล์ secure_esp.c มันจะถูกดำเนินการโดยกระบวนการหลักและทำงานในลูปที่ไม่มีที่สิ้นสุด สำหรับตัวอย่างกะพริบ LED ถูกกำหนดไว้ใน GPIO PIN 9 มันจะปิดและเปิดอีกครั้งหลังจากหนึ่งวินาที ตัวอย่างนี้แสดงวิธีรวมแอพพื้นฐานไปที่ secure_esp:

ในโครงการนี้เปิดใช้งานการเข้ารหัสแฟลช แฟลชเริ่มต้นจะต้องทำด้วยคำสั่ง Flash ปกติ:
idf.py -p [port] flash monitor
หลังจากนั้น ESP32 สามารถฉายได้ด้วยคำสั่งที่เข้ารหัสแฟลชเท่านั้น:
idf.py -p [port] encrypted-flash monitor
หากข้อความแสดงข้อผิดพลาดดังต่อไปนี้จะเป็นประโยชน์ในการกดปุ่มบูตบน ESP32 ในขณะที่กระพริบ:
