보안 설계된 ESP32 프레임 워크는 공중 (OTA), 플래시 암호화, 서명 된 회사 원유 검증, MQTT 및 비 휘발성 저장소를 갖춘 업데이트를 갖춘 ESP32 프레임 워크를 설계했습니다. 안전한 기반을 고려하는 모든 종류의 IoT 개발 프로젝트에 사용할 수 있습니다. 이 프로젝트에는 ESP-Wroom-32가 사용됩니다.
Windows Linux 및 Mac 용 ESP-IDF 설치에 대한 자세한 설명은 Espressif 설치 단계별 가이드에서 제공됩니다. 이 프로젝트에서는 우분투와 데비안과의 리눅스 경로가 다음과 같습니다.
전제 조건 :
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
프로젝트 용 폴더를 만들고 GIT에서 ESP32 프레임 워크를 다운로드하십시오.
cd ~/esp
git clone https://github.com/flouflouit/secure_esp
이 프로젝트에 필요한 명령의 짧은 목록. 루트 프로젝트 폴더 secure_esp 에서 모두 실행해야합니다.
Wi -Fi의 SSID 및 비밀번호는 Example Connection Configuration 또는 SDKConfig에서 직접 idf.py menuconfig 에서 구성됩니다.
CONFIG_EXAMPLE_WIFI_SSID=""
CONFIG_EXAMPLE_WIFI_PASSWORD=""

업데이트 서버 및 MQTT 브로커 인증서를 작성해야합니다. 따라서 charnegate_creation.sh bash 스크립트가 구현되었습니다. 이 스크립트가 MQTT 브로커에서 실행되면 MQTT 인증서는 모기 폴더에 직접 복사 할 수 있습니다. IP 변수에는 업데이트 서버의 IP 주소와 스크립트에서 편집 해야하는 MQTT 브로커가 포함되어야합니다.
. ~/esp/secure_esp/certificate_creation.sh
이 스크립트는 다음과 같은 트리 구조를 생성합니다.

또한 스크립트는 키와 인증서를 ota_certs 및 mqtt_certs 프로젝트 폴더에 복사합니다.
펌웨어의 서명 프로세스에는 서명 키가 필요합니다. 이 Sigining 키는 Root Project Folder secure_esp 에서 실행 해야하는 OpenSSL을 사용하여 작성됩니다.
openssl ecparam -name prime256v1 -genkey -noout -out ~/esp/secure_esp/secure_boot_signing_key.pem
우분투 서버 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/폴더에 복사하십시오.
그 후 브로커를 다시 시작해야합니다.
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
charnets_creation.sh는 폴더 MQTT_CERTS 및 OTA_CERTS를 만듭니다. 이 폴더에서는 업데이트 및 MQTT 서버의 인증서와 키가 생성 된 CA 디렉토리에서 자동으로 복사됩니다. 그 후, MQTT 브로커의 IP 주주는 mqtt.c 파일의 소스 코드에 구성되어야합니다.

우리는 TLS에 대한 안전한 연결을 위해 MQTTS와 PORT 8883을 사용합니다.
/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/업데이트/간격 - 주제를 게시하십시오
mosquitto_pub -h $IP -t "/esp/update/interval" -m "10000" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/ESP/업데이트/실행 - 주제 게시
mosquitto_pub -h $IP -t "/esp/update/run" -m "" -p 8883 -d --cert client.crt --key client.key --cafile ca.crt/esp/다시 시작 - 게시 주제를 게시하십시오
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 업데이트 펌웨어 버전은 실행중인 펌웨어 버전보다 높아야합니다. 그렇기 때문에 OTA 업데이트 프로젝트를 구축하기 전에 CONFIG_APP_PROJECT_VER 의 파일에서 버전 번호를 늘려야합니다. 또는 응용 프로그램 관리자의 idf.py menuconfig 수행 할 수 있습니다. 
펌웨어 업그레이드 URL은 예제 구성에서 idf.py menuconfig 에서 변경하거나 sdkconfig 파일에서 dircetly에서 변경할 수 있습니다 : CONFIG_EXAMPLE_FIRMWARE_UPGRADE_URL

빌드 프로세스 중에 펌웨어는 secure_boot_signing_key.pem과 디지털로 서명됩니다.
idf.py build
이 명령을 실행 한 후 펌웨어 바이너리는 다음과 같이 찾을 수 있습니다. ~/esp/secure_esp/build/secure_esp.bin
아직 완료되지 않은 경우 arperty_creation.sh Script를 사용하여 파일 update_cert.pem 및 update_cert.pem을 생성하십시오.
그 후이 파일은 펌웨어의 바이너리와 함께 한 폴더에 복사해야합니다. 업데이트 서버를 시작하려면 다음 명령이 사용됩니다.
openssl s_server -WWW -key update_key.pem -cert update_cert.pem -port 8070
이 프로젝트의 응용 프로그램을 코딩하려면 예제 Blink 응용 프로그램이 코드에 포함되어 있습니다. 이 예제 응용 프로그램은 secure_esp.c 파일을 찾을 수 있습니다. 주요 프로세스에 의해 실행되며 끝없는 루프로 실행됩니다. 깜박임 예제의 경우 LED가 GPIO PIN 9에 정의됩니다. 1 초 후에 다시 꺼집니다. 이 예제는 Secure_esp에 기본 앱을 포함시키는 방법을 보여줍니다.

이 프로젝트에서는 플래시 암호화가 활성화됩니다. 초기 플래시는 일반 플래시 명령으로 수행해야합니다.
idf.py -p [port] flash monitor
그 후 ESP32는 암호화 된 플래시 명령으로 만 플래시 할 수 있습니다.
idf.py -p [port] encrypted-flash monitor
다음 오류 메시지가 발생하면 깜박이는 동안 ESP32의 부팅 버튼을 누르는 것이 도움이됩니다.
