Kerangka kerja ESP32 yang dirancang aman dengan pembaruan melalui udara (OTA), enkripsi flash, verifikasi firmeware yang ditandatangani, MQTT dan penyimpanan non-volatile. Ini dapat digunakan untuk semua jenis proyek pengembangan IoT, yang mempertimbangkan basis yang aman. Untuk proyek ini, ESP-WROOM-32 digunakan.
Penjelasan lengkap tentang pemasangan ESP-IDF untuk Windows Linux dan Mac tersedia di panduan instalasi Langkah demi Langkah Espressif. Dalam proyek ini jalur Linux dengan Ubuntu dan Debian diikuti:
Prasyarat:
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
Unduh & Instal:
mkdir -p ~/esp
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
cd ~/esp/esp-idf
./install.sh
Gunakan ESP-IDF (perlu dieksekusi setiap kali cangkang baru diluncurkan):
. ~/esp/esp-idf/export.sh
Buat folder untuk proyek dan unduh kerangka kerja ESP32 dari git:
cd ~/esp
git clone https://github.com/flouflouit/secure_esp
Daftar pendek perintah yang diperlukan untuk proyek ini. Semuanya harus dieksekusi di folder proyek root secure_esp .
SSID dan kata sandi untuk wifi dikonfigurasi dalam idf.py menuconfig di bawah Example Connection Configuration atau langsung di SDKConfig:
CONFIG_EXAMPLE_WIFI_SSID=""
CONFIG_EXAMPLE_WIFI_PASSWORD=""

Untuk server pembaruan dan sertifikat broker MQTT perlu dibuat. Oleh karena itu, skrip bash sertifikat_creation.sh diimplementasikan. Jika skrip ini dieksekusi pada broker MQTT, sertifikat MQTT dapat secara langsung disalin ke folder Mosquitto. Variabel IP harus berisi alamat IP dari server pembaruan dan broker MQTT, yang perlu diedit dalam skrip.
. ~/esp/secure_esp/certificate_creation.sh
Skrip ini menghasilkan struktur pohon berikut:

Selain itu, skrip juga menyalin kunci dan sertifikat ke folder proyek ota_certs dan mqtt_certs .
Proses penandatanganan firmware membutuhkan kunci penandatanganan. Kunci sigining ini dibuat dengan openssl yang perlu dieksekusi di folder proyek root secure_esp :
openssl ecparam -name prime256v1 -genkey -noout -out ~/esp/secure_esp/secure_boot_signing_key.pem
Instalasi broker Mosquitto, yang dilakukan di Ubuntu Server 20.04 LTS:
sudo apt-get install mosquitto
Instalasi klien Mosquitto:
sudo apt-get install mosquitto-clients
Setelah broker Mosquitto diinstal file baru bernama secure.conf harus dibuat di folder: /etc/mosquitto/conf.d file ini harus berisi informasi berikut:
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
Salin sertifikat ca.crt, server.crt dan server.key, dibuat dengan sertifikat_creation.sh, ke/etc/mosquitto/sertifikat/folder.
Setelah itu, broker perlu dimulai ulang:
sudo systemctl restart mosquitto.service
Pialang dapat diuji dengan berlangganan topik dan menerbitkan pesan ke topik ini. IP harus diubah ke alamat IP broker.
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
Certificate_creation.sh membuat folder MQTT_CERTS dan OTA_CERTS. Di folder ini sertifikat dan kunci untuk pembaruan dan server MQTT secara otomatis disalin dari direktori CA yang dibuat. Setelah itu, alamat IP dari broker MQTT harus dikonfigurasi dalam kode sumber file mqtt.c :

Kami menggunakan MQTTS dan Port 8883 untuk koneksi yang aman melalui TLS.
/ESP/UPDATE/URL - Topik Publikasikan
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 - Topik Publikasikan
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 - Publikasikan topik
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 - TOPIK PUBLIKA
mosquitto_pub -h $IP -t "/esp/update/run" -m "" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/ESP/RESTART - Topik Publikasikan
mosquitto_pub -h $IP -t "/esp/restart" -m "" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/esp/log - berlangganan topik
mosquitto_sub -h $IP -t "/esp/log" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt Versi pembaruan firmware harus lebih tinggi dari versi firmware yang sedang berjalan. Itulah sebabnya nomor versi perlu ditingkatkan dalam file SDKConfig di bawah CONFIG_APP_PROJECT_VER sebelum membangun proyek untuk pembaruan OTA. Atau dapat dilakukan oleh idf.py menuconfig di bawah Application Manager:
URL Peningkatan Firmware dapat diubah di idf.py menuconfig di bawah Contoh Konfigurasi atau Dircetly di file SDKConfig: CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL

Selama proses pembangunan firmware ditandatangani secara digital dengan SURE_BOOT_SIGNING_KEY.PEM:
idf.py build
Setelah menjalankan perintah ini, biner firmware dapat ditemukan di bawah: ~/esp/secure_esp/build/secure_esp.bin
Jika belum dilakukan, buat file update_cert.pem dan update_cert.pem dengan skrip sertifikat_creation.sh.
Setelah itu, file -file ini harus disalin dalam satu folder dengan biner firmware. Untuk memulai server pembaruan, perintah berikut digunakan:
openssl s_server -WWW -key update_key.pem -cert update_cert.pem -port 8070
Untuk pengkodean aplikasi untuk proyek ini Contoh aplikasi blink termasuk dalam kode. Contoh aplikasi ini dapat ditemukan file secure_esp.c . Ini akan dieksekusi oleh proses utama dan berjalan dalam lingkaran tanpa akhir. Untuk contoh blink, LED didefinisikan pada pin GPIO 9. Berlaku dan hidup lagi setelah satu detik. Contoh ini menunjukkan cara memasukkan aplikasi dasar ke Secure_esp:

Dalam proyek ini enkripsi flash diaktifkan. Flash awal harus dilakukan dengan perintah flash normal:
idf.py -p [port] flash monitor
Setelah itu ESP32 hanya dapat dilontarkan dengan perintah terenkripsi-flash:
idf.py -p [port] encrypted-flash monitor
Jika mengikuti pesan kesalahan terjadi, akan bermanfaat untuk menekan tombol boot pada ESP32 saat berkedip:
