{"id":369850,"date":"2024-05-21T04:12:29","date_gmt":"2024-05-21T04:12:29","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=369850"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=369850","title":{"rendered":"<span>PKI \u0434\u043b\u044f IOT, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 ESP32 + Mosquitto SSL \u0438 Flash Encryption \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0426\u0435\u043b\u044c \u0441\u0442\u0430\u0442\u044c\u0438 &#8212; \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0439 Iot-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0441\u0435\u0442\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 ESP32 \u0438 \u043e\u0431\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c.\u00a0<\/p>\n<p>\u041e\u0431\u0449\u0443\u044e \u0438\u0434\u0435\u044e \u0438 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b \u043d\u0430 \u0442\u0435\u043c\u044b:<\/p>\n<ul>\n<li>\n<p>\u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 mosquitto SSL\/TLS \u0438\u0437 docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0434\u043b\u044f \u0431\u0440\u043e\u043a\u0435\u0440\u0430 Mosquitto SSL \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 ESP32<\/p>\n<\/li>\n<li>\n<p>\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0434\u043b\u044f ESP32 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0437\u0430\u0449\u0438\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0437\u0430\u0449\u0438\u0442\u044b \u0434\u043b\u044f ESP32 &#8212; Secure Boot 2, Flash Encryption, NVS Encryption<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0442\u0430\u043a, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435. \u0414\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 MQTT-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 ESP32 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b. \u041c\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 \u043b\u043e\u0433\u0438\u043d\u043e\u0432\/\u043f\u0430\u0440\u043e\u043b\u0435\u0439\u00a0 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 Mosquitto. \u0412\u043c\u0435\u0441\u0442\u043e \u043f\u0430\u0440\u044b \u043b\u043e\u0433\u0438\u043d\/\u043f\u0430\u0440\u043e\u043b\u044c Mosquitto \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 CN \u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u0445. \u041d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 (Flash encryption + NVS encryption) \u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0442\u044c \u0438\u0445\u00a0 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b (\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0449\u0438\u0442\u0438\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Secure Boot 2). \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435\u0442 \u0446\u0435\u043b\u0438 \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u0438\u043f\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432, \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u0440\u0438\u0441\u043a\u043e\u0432 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u0438 CA \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u044d\u0442\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0443\u0440\u0430.<\/p>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<\/p>\n<h4>\u041f\u0435\u0440\u0432\u044b\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c Mosquitto SSL<\/h4>\n<p>\u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c docker compose. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0436\u0435 \u0441 \u043f\u0435\u0440\u0432\u044b\u0445 \u043f\u0440\u043e\u0431\u043d\u044b\u0445 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043b\u0435\u0433\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u041d\u0438\u0436\u0435 \u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0441\u044c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f docker.<\/p>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0444\u0430\u0439\u043b \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b mosquitto docker-compose.yml.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u043e\u0440\u0442 8883 \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u0438\u0440\u043e\u043c. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0443\u043a\u0430\u0436\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 mosquitto.<\/p>\n<pre><code class=\"yaml\">version: '3.8'  services:     mosquitto:         image: eclipse-mosquitto:2         ports:             - 8883:8883             - 9001:9001         volumes:             - .\/mosquitto\/config:\/mosquitto\/config\/             - .\/mosquitto\/data:\/mosquitto\/data\/             - .\/mosquitto\/log:\/mosquitto\/log\/             - .\/mosquitto\/certs:\/mosquitto\/certs\/         networks:             - mosquitto networks:     mosquitto:         name: mosquitto         driver: bridge<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e mosquitto, \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043d\u0430\u0448\u0435\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438. <\/p>\n<p>\u0424\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 <strong>mosquitto.conf<\/strong><\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<pre><code class=\"bash\"># \u0445\u0440\u0430\u043d\u0438\u043c \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u043e \u0438 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 persistence true # \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0442\u0438\u043f\u044b \u043b\u043e\u0433\u043e\u0432 (\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0445 error, warning, notice and information) log_type # \u0412 \u043b\u043e\u0433\u0430\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438  log_timestamp_format %Y-%m-%dT%H:%M:%S # \u0417\u0430\u043f\u0440\u0435\u0442\u0438\u043c \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f: allow_anonymous false # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u0430 8883 \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435: # MQTT over TLS listener 8883 # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432: require_certificate true # \u0418\u0441\u043a\u043b\u044e\u0447\u0438\u043c \u043a\u043b\u043e\u043d\u044b \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432: use_username_as_clientid true # \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0431\u0440\u043e\u043a\u0435\u0440\u0443, \u0447\u0442\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c CN \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 username: use_identity_as_username true  # \u0423\u043a\u0430\u0436\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b CA, \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043b\u044e\u0447 \u0441\u0435\u0440\u0432\u0435\u0440\u0430: cafile \/mosquitto\/certs\/ca.crt certfile \/mosquitto\/certs\/server.crt keyfile \/mosquitto\/certs\/server.key  <\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044f \u0442\u043e\u043f\u0438\u043a\u043e\u0432, \u0442\u043e mosquitto \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0432\u0435\u0441\u0442\u0438 \u043a\u0440\u0430\u0441\u043e\u0442\u0443 \u0432 \u0432\u043e\u043f\u0440\u043e\u0441\u0435 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0442\u043e\u043f\u0438\u043a\u043e\u0432. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f ACL-\u0444\u0430\u0439\u043b \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438. \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <strong>mosquitto.conf<\/strong><\/p>\n<pre><code class=\"bash\">acl_file my_acl_file_01<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0434\u043b\u044f \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u0438 \u0447\u0442\u043e \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e &#8212; \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0435 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 <strong>client id<\/strong> \u0438\u043b\u0438 <strong>username<\/strong>. \u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u043e\u043f\u0438\u043a, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 <strong>username<\/strong>:<\/p>\n<pre><code class=\"bash\">pattern write my_sensor\/%u\/data<\/code><\/pre>\n<p>\u042d\u0442\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 ACL \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u0443-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432 \u0442\u043e\u043f\u0438\u043a\u0435 \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f (\u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0431\u0440\u043e\u043a\u0435\u0440 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0438\u0437 CN \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430) \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 (\u0442.\u0435. \u0431\u0435\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438) \u0441\u0442\u0440\u043e\u0433\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u042d\u0442\u0438 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0435\u0442\u0438 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430 mosquitto-bridge, NiFi \u0438\/\u0438\u043b\u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0438\u043c-\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443 (Kafka \u0438 \u0442.\u043f.).\u00a0<\/p>\n<h3>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432<\/h3>\n<p>\u0427\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e?\u00a0<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c CA (\u043e\u0447\u0435\u043d\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442)<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u044e\u0447 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 CA)<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a\u043b\u044e\u0447\u0435\u0439-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043f 1 \u0438 2 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0440\u0443\u043a\u0430\u043c\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u0441\u0443\u0442\u0438 \u0442\u0438\u043f\u043e\u0432\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f CA \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0430\u043c\u043e\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b. \u0414\u043b\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0439 \u0441\u0435\u0442\u0438 \u044d\u0442\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0441\u0430\u043c\u043e\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u043c, \u0447\u0442\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0435 \u041f\u041e, \u0442\u0430\u043a\u043e\u0435 \u043a\u0430\u043a \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u044b \u0438 \u0442.\u043f. \u041e\u0434\u043d\u0430\u043a\u043e, \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0439 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0439 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0439 \u0441\u0435\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 (\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0434\u0440\u0443\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c) \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0438 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442 &#8212; \u0432\u0440\u0435\u0434\u043d\u043e.\u00a0<\/p>\n<h4>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c CA<\/h4>\n<p>\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0445\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0432 ~\/server\/. \u0414\u043b\u044f CA \u0431\u0443\u0434\u0435\u0442~\/ca\/.<\/p>\n<p>\u041a\u043b\u044e\u0447 CA (\u0431\u0435\u0437 passphrase):<\/p>\n<pre><code class=\"bash\">openssl genrsa -out ca\/ca.key 2048<\/code><\/pre>\n<p>\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 CA (\u043d\u0430 30 \u043b\u0435\u0442):<\/p>\n<pre><code class=\"bash\">openssl req -new -x509 -days 10950 -key ca\/ca.key -out ca\/ca.crt<\/code><\/pre>\n<pre><code class=\"bash\">You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Moscow Locality Name (eg, city) []:Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]:Leo4 Organizational Unit Name (eg, section) []:iot Common Name (e.g. server FQDN or YOUR name) []:iot.leo4.ru Email Address []:iot@leo4.ru<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 CA \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:  <\/p>\n<pre><code class=\"bash\">cp ca\/ca.crt certs\/ca.crt<\/code><\/pre>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043b\u044e\u0447 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0431\u0440\u043e\u043a\u0435\u0440\u0430:<\/p>\n<pre><code class=\"bash\">mkdir server sudo openssl genrsa -out server\/server.key 2048<\/code><\/pre>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 CA:<\/p>\n<pre><code class=\"bash\">oleg@leo4broker2:sudo openssl req -new -out server\/server.csr -key server\/server.key You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Moscow Locality Name (eg, city) []:Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]:Leo4 Organizational Unit Name (eg, section) []:mqtt-broker Common Name (e.g. server FQDN or YOUR name) []:iot.leo4.ru Email Address []:iot@leo4.ru  Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:. An optional company name []:.<\/code><\/pre>\n<p>\u0412\u044b\u0434\u0430\u0434\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430:<\/p>\n<pre><code class=\"bash\">oleg@leo4broker2:~$ sudo openssl x509 -req -in server\/server.csr -CA ca\/ca.crt -CAkey ca\/ca.k ey -CAcreateserial -out server\/server.crt -days 10950 Certificate request self-signature ok subject=C = RU, ST = Moscow, L = Moscow, O = Leo4, OU = mqtt-broker, CN = iot.leo4.ru, emailAddress = iot@leo4.ru<\/code><\/pre>\n<p>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:<\/p>\n<pre><code class=\"bash\">oleg@mqtt:~\/server$ ls server.crt  server.csr  server.key oleg@mqtt:~$ cp ca\/ca.crt mosquitto\/certs\/ oleg@mqtt:~$ cp server\/server.crt mosquitto\/certs\/ oleg@mqtt:~$ cp server\/server.key mosquitto\/certs\/ cp: cannot open 'server\/server.key' for reading: Permission denied oleg@mqtt:~$ sudo cp server\/server.key mosquitto\/certs\/ oleg@mqtt:~$ cd mosquitto oleg@mqtt:~\/mosquitto$ ls certs  config  data  etc  log oleg@mqtt:~\/mosquitto$ cd certs oleg@mqtt:~\/mosquitto\/certs$ ls ca.crt  server.crt  server.key<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 Mosquitto:<\/p>\n<pre><code class=\"bash\">oleg@mqtt:~$ sudo docker compose up -d [+] Running 4\/4  \u2714 mosquitto 3 layers [\u28ff\u28ff\u28ff]      0B\/0B      Pulled                          4.5s    \u2714 c926b61bad3b Pull complete                                              0.6s    \u2714 a87e6a8c3b38 Pull complete                                              0.6s    \u2714 4e2ff55c815a Pull complete                                              0.5s [+] Running 1\/2 Network mosquitto           Created                          1.0s  \u2714 Container oleg-mosquitto-1  Started<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430:<\/p>\n<pre><code class=\"bash\">oleg@mqtt:~$ sudo docker compose ps NAME               IMAGE                 COMMAND                  SERVICE     CREATED          STATUS          PORTS oleg-mosquitto-1   eclipse-mosquitto:2   \"\/docker-entrypoint....\"   mosquitto   43 minutes ago   Up 12 minutes   0.0.0.0:8883->8883\/tcp, :::8883->8883\/tcp, 1883\/tcp, 0.0.0.0:9001->9001\/tcp, :::9001->9001\/tcp<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u0438\u0440\u0430 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430:<\/p>\n<pre><code class=\"bash\">D:\\OpenSSL-Win64\\bin>openssl s_client -connect iot.leo4.ru:8883 CONNECTED(000001E0) depth=1 C = RU, ST = Moscow, L = Moscow, O = Leo4, OU = IT, CN = iot.leo4.ru, emailAddress = iot@leo4.ru verify error:num=19:self-signed certificate in certificate chain verify return:1 depth=1 C = RU, ST = Moscow, L = Moscow, O = Leo4, OU = IT, CN = iot.leo4.ru, emailAddress = iot@leo4.ru verify return:1 depth=0 C = RU, ST = Moscow, L = Moscow, O = Leo4, OU = mqtt, CN = iot.leo4.ru, emailAddress = iot@leo4.ru verify return:1 --- Certificate chain  0 s:C = RU, ST = Moscow, L = Moscow, O = Leo4, OU = mqtt, CN = iot.leo4.ru, emailAddress = iot@leo4.ru    i:C = RU, ST = Moscow, L = Moscow, O = Leo4, OU = IT, CN = iot.leo4.ru, emailAddress = iot@leo4.ru    a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256    v:NotBefore: Jan 25 13:56:50 2024 GMT; NotAfter: Jan 17 13:56:50 2054 GMT  1 s:C = RU, ST = Moscow, L = Moscow, O = Leo4, OU = IT, CN = iot.leo4.ru, emailAddress = iot@leo4.ru    i:C = RU, ST = Moscow, L = Moscow, O = Leo4, OU = IT, CN = iot.leo4.ru, emailAddress = iot@leo4.ru    a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256    v:NotBefore: Jan 25 13:50:25 2024 GMT; NotAfter: Jan 17 13:50:25 2054 GMT --- Server certificate -----BEGIN CERTIFICATE----- .. <\/code><\/pre>\n<p>\u0418\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 mosquitto \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c\u0438:<\/p>\n<pre><code class=\"bash\">oleg@mqtt:~$ tree . . \u251c\u2500\u2500 ca \u2502   \u251c\u2500\u2500 ca.crt \u2502   \u2514\u2500\u2500 ca.key \u251c\u2500\u2500 docker-compose.yml \u251c\u2500\u2500 mosquitto \u2502   \u251c\u2500\u2500 certs \u2502   \u2502   \u251c\u2500\u2500 ca.crt \u2502   \u2502   \u251c\u2500\u2500 server.crt \u2502   \u2502   \u2514\u2500\u2500 server.key \u2502   \u251c\u2500\u2500 config \u2502   \u2502   \u2514\u2500\u2500 mosquitto.conf \u2502   \u251c\u2500\u2500 data \u2502   \u2502   \u2514\u2500\u2500 mosquitto.db \u2502   \u251c\u2500\u2500 etc \u2502   \u2514\u2500\u2500 log \u2502       \u2514\u2500\u2500 mosquitto.log \u2514\u2500\u2500 server     \u251c\u2500\u2500 server.crt     \u251c\u2500\u2500 server.csr     \u2514\u2500\u2500 server.key  8 directories, 12 files<\/code><\/pre>\n<p><em>* \u043f\u0430\u043f\u043a\u0443 server \u0441\u043e \u0432\u0441\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430 \u043d\u0435\u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u044c\u044e.<\/em> <\/p>\n<p>\u0424\u0430\u0439\u043b ~\/mosquitto\/config\/mosquitto.conf \u0438\u0437 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430: <\/p>\n<pre><code class=\"bash\">persistence true persistence_location \/mosquitto\/data\/ #logs log_type subscribe log_type unsubscribe log_type websockets log_type error log_type warning log_type notice log_type information log_dest file \/mosquitto\/log\/mosquitto.log connection_messages true log_timestamp true log_timestamp_format %Y-%m-%dT%H:%M:%S #log to the console log_dest stdout #log to the topic $SYS\/broker\/log\/# log_dest topic  #password_file \/mosquitto\/passwd_file allow_anonymous false  # MQTT over WebSockets listener 9001 0.0.0.0 protocol websockets  # MQTT over TLS listener 8883 require_certificate true use_identity_as_username true use_username_as_clientid true  cafile \/mosquitto\/certs\/ca.crt certfile \/mosquitto\/certs\/server.crt keyfile \/mosquitto\/certs\/server.key<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043b\u0430\u0434\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432. \u041f\u043e\u043a\u0430\u0436\u0443 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 \u0434\u043b\u044f \u041e\u0421 \u041b\u0438\u043d\u0443\u043a\u0441, \u0430 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440 Windows \u0442.\u043a. \u0442\u0430\u043c \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u043e IDE.\u00a0<\/p>\n<p>\u041f\u0440\u043e\u0439\u0434\u0435\u043c \u043f\u0443\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430. \u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u043e\u0434\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e &#8212; <strong>\u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 = \u0438\u043c\u044f \u043f\u0430\u043f\u043a\u0438 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 = \u0438\u043c\u0435\u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0438 \u043a\u043b\u044e\u0447\u0435\u0439 = username = client Id = CN=\u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u043c\u0438 \u043e\u0431\u0440\u0430\u0437\u0430\u043c\u0438 \u043a\u043b\u044e\u0447\u0435\u0439 \u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430<\/strong>. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0430, \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443 &lt;dev>&lt;\u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440<em>>&lt;s>&lt;\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 5 \u0446\u0438\u0444\u0440<\/em>>. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: dev1s12345. \u0428\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d \u043d\u0430 \u0445\u043e\u0434\u0443, \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0439 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0418\u0442\u0430\u043a, \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u201c\u0440\u0443\u0447\u043a\u0430\u043c\u0438\u201d.<\/p>\n<p>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u044e\u0447:<\/p>\n<pre><code class=\"bash\">oleg@mqtt:~$ mkdir dev1s12345 oleg@mqtt:~$ cd dev1s12345 oleg@mqtt:~\/dev1s12345$ openssl genrsa -out dev1s12345.key 2048<\/code><\/pre>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442:<\/p>\n<pre><code class=\"bash\">oleg@mqtt:~\/dev1s12345$ openssl req -new -out  dev1s12345.csr -key  dev1s12345.key You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Moscow Locality Name (eg, city) []:Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]:IT Organizational Unit Name (eg, section) []:IT Common Name (e.g. server FQDN or YOUR name) []:dev1s12345 Email Address []:device@leo4.ru  Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:<\/code><\/pre>\n<p><em>\u042d\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u0441\u0435\u0440\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0443\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0438\/\u0438\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0430, \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a CA\u00a0 &#8212; \u044d\u0442\u0438  \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 openssl \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u043c\u0438 \u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0432\u043e\u0438 \u0410\u041f\u0418 \u0438 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0438\u0441\u044b.  \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u0440\u0430\u0437\u0440\u044f\u0434 \u201c\u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439\u201d \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u0412 \u0442\u043e\u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. <\/em>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0444\u0430\u0439\u043b\u0430-\u0437\u0430\u043f\u0440\u043e\u0441\u0430:<\/p>\n<pre><code class=\"bash\">oleg@mqtt:~\/dev1s12345$ sudo openssl x509 -req -in dev1s12345.csr -CA ~\/ca\/ca.crt -CAkey ~\/ca\/ca.key -CAcreateserial -ou t dev1s12345.crt -days 10950 Certificate request self-signature ok subject=C = RU, ST = Moscow, L = Moscow, O = IT, OU = IT, CN = dev1s12345, emailAddress = device@leo4.ru<\/code><\/pre>\n<p>\u041f\u043e\u0439\u0434\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435, \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0432 \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f\u00a0 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430:<\/p>\n<pre><code class=\"bash\">dev1s12345.key,\u00a0 dev1s12345.crt,\u00a0 ca.crt<\/code><\/pre>\n<h4>ESP32, \u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u0431\u0440\u043e\u043a\u0435\u0440\u0443<\/h4>\n<p>\u041c\u043e\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u043c\u0435\u0441\u0442\u043e \u043d\u0430 \u0431\u0430\u0437\u0435 Windows + Espressif IDE (ESP-IDF) + openssl.\u00a0<\/p>\n<p>\u0427\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0441\u0445\u0435\u043c\u0443 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e partition tables, \u0441 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0435\u0439 fctry, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/p>\n<\/li>\n<li>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f-\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430 ESP32 \u0438 \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 eFuse \u0438 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 Secure Boot 2<\/p>\n<\/li>\n<li>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f Flash encryption<\/p>\n<\/li>\n<li>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f NVS encryption<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043d\u0430\u0448\u0443 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044e \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c\u0438, \u0437\u0430\u0448\u0438\u0444\u0440\u0443\u0435\u043c \u0435\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438\u00a0<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u0434\u043b\u044f nvs key \u0438 otadata<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u043f\u0438\u0448\u0435\u043c \u0438 \u0437\u0430\u0448\u0438\u0444\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0448\u044c\u0435\u043c \u0432 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 eFuse \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u0434\u043b\u044f Secure Boot 2 \u0438 \u043a\u043b\u044e\u0447 \u0434\u043b\u044f Flash encryption, \u0431\u0435\u0437\u0432\u043e\u0437\u0432\u0440\u0430\u0442\u043d\u043e \u043f\u0440\u043e\u0448\u044c\u0435\u043c \u0432 eFuse \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044e Secure Boot 2 \u0438 Flash Encryption\u00a0<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0448\u044c\u0435\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u0441 \u0441\u043e\u0444\u0442\u043e\u043c,\u00a0 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438\u00a0<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043c \u0432 Release Mode, \u0442.\u0435. \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0437\u0430\u043f\u0440\u0435\u0442 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 \u0438 \u0437\u0430\u043f\u0440\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c; \u043e\u0441\u0442\u0430\u0432\u0438\u043c (\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043d\u0438\u0436\u0430\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u043f\u043e \u043c\u043d\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f) \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 UART \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445-\u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0441\u0435 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0438 \u043d\u0430 \u0431\u043e\u0440\u0442\u0443 \u0434\u0438\u0432\u0430\u0439\u0441\u0430 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044f \u0441 \u043d\u0430\u0448\u0438\u043c\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c\u0438. \u0414\u0430\u043b\u0435\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043d\u0430\u0448 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0435\u0439 \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0434\u043b\u044f MQTT \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044f \u043c\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<ol>\n<li>\n<p><strong>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439 (\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u043b\u0435\u0448-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430)<\/strong><\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432\u044b\u0448\u0435 \u043a\u0435\u0439\u0441 \u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c\u0438 \u044f \u0432\u043a\u043b\u044e\u0447\u0430\u044e \u0432 \u0441\u0445\u0435\u043c\u0443 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c (<strong>my_part_table.csv<\/strong>):<\/p>\n<pre><code class=\"cpp\"># Name, Type, SubType, Offset, Size, Flags nvs,      data, nvs,0x11000,  0x4000, otadata,  data, ota,       ,  0x2000, encrypted phy_init, data, phy,       ,  0x1000, factory,  app,  factory,   ,  0x110000, ota_0,    app,  ota_0,     , 0x110000, ota_1,    app,  ota_1,     , 0x110000, fctry,    data, nvs,       , 0x10000, db1,      data, nvs,       , 512K, nvs_key,  data, nvs_keys,  , 0x1000, encrypted<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u043d\u0430\u0431\u043e\u0440\u0435 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b <strong>nvs_key \u0438 fctry<\/strong>.\u00a0<\/p>\n<p>nvs_key &#8212; \u044d\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044f \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f NVS. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c ESP32 \u0441 \u0435\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u0437\u0430\u0449\u0438\u0442\u044b \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e flash encryption \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447 nvs_key \u0434\u043b\u044f nvs-\u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 NVS-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430.<\/p>\n<ol start=\"2\">\n<li>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0434\u043b\u044f Secure Boot 2:<\/strong><\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"bash\">espsecure.py generate_signing_key --version 2 --scheme rsa3072 f:\\global_secret\\secure_boot_signing_key.pem<\/code><\/pre>\n<p>&#8230; \u0418 \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442 \u044d\u0442\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u0430 eFuse \u0432 ESP32:<\/p>\n<pre><code class=\"bash\">espsecure.py digest_sbv2_public_key --keyfile f:\\global_secret\\secure_boot_signing_key.pem --output f:\\secure_boot2\\digest.bin<\/code><\/pre>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043f\u0430\u043f\u043a\u0443 \u0434\u043b\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0434\u0438\u0432\u0430\u0439\u0441\u0430 (\u043a\u043b\u0438\u0435\u043d\u0442\u0430):<\/p>\n<p><strong>.\\dev1s12345<\/strong><\/p>\n<ol start=\"3\">\n<li>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 (\u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u0438\u0432\u0430\u0439\u0441\u0430) \u043a\u043b\u044e\u0447 \u0434\u043b\u044f Flash encryption:<\/strong> <\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"bash\">espsecure.py generate_flash_encryption_key f:\\dev1s12345\\dev1s12345_flash_encryption_key.bin<\/code><\/pre>\n<p> \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0434\u0438\u0432\u0430\u0439\u0441\u0430 \u043d\u0443\u0436\u0435\u043d \u0432 \u0446\u0435\u043b\u044f\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u0438 \u0437\u0430\u0449\u0438\u0442\u044b \u0432\u0441\u0435\u0439 \u0441\u0435\u0442\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u044e\u0447\u0435\u0439 \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u0442 \u0440\u0438\u0441\u043a\u0438 \u043f\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044f\u043c ESP32. <\/p>\n<ol start=\"4\">\n<li>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u044e\u0447\u0438 \u0437\u0430\u0449\u0438\u0442\u044b nvs_key:<\/strong>  <\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"bash\">nvs_partition_gen.py generate-key --keyfile dev1s12345_nvs_key.bin --outdir .\\dev1s12345<\/code><\/pre>\n<ol start=\"5\">\n<li>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 fctry\u00a0 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 csv \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432<\/strong><\/p>\n<p><strong>(\u0444\u0430\u0439\u043b dev1s12345_fctry_partition.csv):<\/strong><\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"yaml\">key,type,encoding,value mqtt_ns,namespace,, server_uri,data,string,mqtts:\/\/iot.leo4.ru:8883 device_id,data,string,dev1s12345 ca_cert,file,binary,ca.crt cert,file,binary,dev1s12345.crt priv_key,file,binary,dev1s12345.key<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044e \u043c\u044b, \u043f\u043e\u043c\u0438\u043c\u043e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432, \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 URI \u043d\u0430\u0448\u0435\u0433\u043e mqtt-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u0438\u0432\u0430\u0439\u0441\u0430 device_id \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a \u0432 \u0438\u043c\u0435\u043d\u0430 \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u0438 \u0442.\u043f. \u0415\u0441\u043b\u0438 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044f \u0442\u043e\u043f\u0438\u043a\u043e\u0432, \u0442\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0438\u043b\u0438 \u0438\u043c\u0435\u043d\u0430 \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 \u044d\u0442\u043e\u0442 \u0436\u0435 \u0444\u0430\u0439\u043b. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u043d\u0430 100% \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u043c \u0438\u0437 \u043a\u043e\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0431\u0440\u043e\u043a\u0435\u0440\u0430.\u00a0<\/p>\n<p>\u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0438 \u0448\u0438\u0444\u0440\u0443\u0435\u043c \u0441 \u0440\u0430\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0434\u043b\u044f nvs_key:<\/p>\n<pre><code class=\"bash\">nvs_partition_gen.py encrypt --inputkey .\\dev1s12345\\keys\\dev1s12345_nvs_key.bin .\\dev1s12345\\dev1s12345_fctry_partition.csv .\\dev1s12345\\dev1s12345_fctry_partition_enc.bin 0x10000<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0449\u0430\u044e \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u0441 \u0442\u0438\u043f\u043e\u043c NVS \u0448\u0438\u0444\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u043a\u0440\u0430\u0442\u043d\u043e, \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u201c\u0441\u0432\u043e\u0438\u043c\u0438\u201d \u043a\u043b\u044e\u0447\u0430\u043c\u0438 nvs_key. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u0435\u0447\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u0432 partition tables \u0444\u043b\u0430\u0433\u043e\u043c encrypted \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0410 \u0442\u0430\u043a\u0436\u0435, \u043d\u0435\u043b\u044c\u0437\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0434\u043b\u044f Flash Encryption.<\/p>\n<ol start=\"6\">\n<li>\n<p><strong>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044e nvs key \u0441 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0437\u0430\u0449\u0438\u0442\u044b NVS \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439:<\/strong><\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"bash\">espsecure.py --keyfile .\\dev1s12345\\dev1s12345_flash_encryption_key.bin --address 0x3e0000 --output .\\dev1s12345\\dev1s12345_nvs_key_partition_enc.bin .\\dev1s12345\\keys\\dev1s12345_nvs_key.bin<\/code><\/pre>\n<p>\u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 IDE.<\/p>\n<p>\u0412 menuconfig \u0438\u043b\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 IDE &#8212; sdkconfig \u0443\u043a\u0430\u0436\u0435\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0443\u044e \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044e my_part_table.csv, \u0434\u0430\u043b\u0435\u0435 &#8212; \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043e\u043f\u0446\u0438\u0438 Secure Boot 2 \u0438 Flash Encryption. \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043e\u043f\u0446\u0438\u044e \u201c\u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435\u201d. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043e\u043f\u0446\u0438\u044e NVS Encryption (\u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 Flash Encryption).<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code class=\"bash\">.\\build\\myapp.bin .\\build\\bootloader\\bootloader.bin .\\build\\partition_table\\partition-table.bin .build\\ota_data_initial.bin<\/code><\/pre>\n<p><strong>\u042d\u0442\u0438 4 \u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u044f\u043c\u0438 \u043f\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0438 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u043d\u0430\u0448 \u201c\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439\u201d \u0434\u0438\u0441\u043a \u0432 \u043f\u0430\u043f\u043a\u0443 .\\app<\/strong><\/p>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443 &#8212; \u0442\u0435\u043f\u0435\u0440\u044c \u0448\u0438\u0444\u0440\u0443\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 otadata:<\/p>\n<pre><code>espsecure.py --keyfile .\\dev1s12345\\dev1s12345_flash_encryption_key.bin --address 0x15000 --output .\\dev1s12345\\dev1s12345_otadata_enc.bin .\\app\\ota_data_initial.bin<\/code><\/pre>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442 &#8212; \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0439 (partition table):<\/p>\n<pre><code>espsecure.py --keyfile .\\dev1s12345\\dev1s12345_flash_encryption_key.bin --address 0x10000 --output .\\dev1s12345\\dev1s12345_partition_table_enc.bin .\\app\\partition-table.bin<\/code><\/pre>\n<ol start=\"7\">\n<li>\n<p><strong>\u041f\u043e\u0434\u043f\u0438\u0448\u0435\u043c bootloader \u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/strong><\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"bash\">espsecure.py sign_data --version 2 --keyfile .\\global_secret\\secure_boot_signing_key.pem --output .\\app\\bootloader_signed.bin .\\app\\bootloader.bin  espsecure.py sign_data --version 2 --keyfile .\\global_secret\\secure_boot_signing_key.pem --output .\\app\\myapp_signed.bin .\\app\\myapp.bin<\/code><\/pre>\n<p>\u0428\u0438\u0444\u0440\u0443\u0435\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 bootloader \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code>espsecure.py --keyfile .\\dev1s12345\\dev1s12345_flash_encryption_key.bin --address 0x1000 --output .\\dev1s12345\\dev1s12345_bootloader_enc.bin .\\app\\bootloader_signed.bin  espsecure.py --keyfile .\\dev1s12345\\dev1s12345_flash_encryption_key.bin --address 0x20000 --output .\\dev1s12345\\dev1s12345_myapp_enc.bin .\\app\\myapp_signed.bin<\/code><\/pre>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u0443 \u043d\u0430\u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u044b \u0432\u0441\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u043a\u043b\u044e\u0447\u0435\u0439 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0414\u0435\u0440\u0435\u0432\u043e \u201c\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e\u201d \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">F: \u251c\u2500\u2500 secure_boot2 \u2502   \u2514\u2500\u2500 digest.bin \u251c\u2500\u2500 global_secret \u2502   \u251c\u2500\u2500 secure_boot_signing_key.pem \u2502    \u251c\u2500\u2500 app \u2502   \u251c\u2500\u2500 bootloader.bin \u2502   \u251c\u2500\u2500 ota_data_initial.bin \u2502   \u251c\u2500\u2500 myapp.bin \u2502   \u251c\u2500\u2500 partition-table.bin \u2502   \u251c\u2500\u2500 bootloader_signed.bin \u2502   \u2514\u2500\u2500 myapp_signed.bin \u251c\u2500\u2500 ca \u2502   \u2514\u2500\u2500 ca.crt \u251c\u2500\u2500 prepare_stage1.cmd   \u251c\u2500\u2500 burn_stage1.cmd \u251c\u2500\u2500 my_part_table.csv \u251c\u2500\u2500 dev1s12345     \u251c\u2500\u2500 keys     \u2502   \u2514\u2500\u2500 dev1s12345_nvs_key.bin     \u251c\u2500\u2500 mqtt     \u2502  \u251c\u2500\u2500 dev1s12345.key     \u2502  \u2514\u2500\u2500 dev1s12345.crt     \u251c\u2500\u2500 dev1s12345_flash_encryption_key.bin     \u251c\u2500\u2500 dev1s12345_fctry_partition.csv     \u251c\u2500\u2500 dev1s12345_fctry_partition_enc.bin     \u251c\u2500\u2500 dev1s12345_nvs_key_partition_enc.bin     \u251c\u2500\u2500 dev1s12345_otadata_enc.bin     \u251c\u2500\u2500 dev1s12345_bootloader_enc.bin     \u251c\u2500\u2500 dev1s12345_myapp_enc.bin     \u2514\u2500\u2500 dev1s12345_partition_table_enc.bin<\/code><\/pre>\n<p>\u0411\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u0441 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043e\u043c enc \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u041a\u0430\u0436\u0434\u0430\u044f \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439. \u0418\u043d\u043e\u0433\u0434\u0430, \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 (\u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439) \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c (\u201c\u043c\u0435\u0440\u0434\u0436\u0438\u0442\u044c\u201d). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">esptool.py --chip ESP32 merge_bin -o^ .\\dev1s12345\\dev1s12345_merged_flash.bin --flash_mode dio --flash_size 4MB^ 0x1000 .\\dev1s12345\\dev1s12345_bootloader_enc.bin^ 0x10000 .\\dev1s12345\\dev1s12345_partition_table_enc.bin^ 0x20000 .\\dev1s12345\\dev1s12345_myapp_enc.bin^ 0x15000 .\\dev1s12345\\dev1s12345_otadata_enc.bin^ 0x3e0000 .\\dev1s12345\\dev1s12345_nvs_key_partition_enc.bin^ 0x350000 .\\dev1s12345\\dev1s12345_fctry_partition_enc.bin<\/code><\/pre>\n<ol start=\"8\">\n<li>\n<p><strong>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0435 \u043a\u043b\u044e\u0447\u0430 flash encryption \u0438 \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442\u0430 \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u041f\u041e.<\/strong> <\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043a\u043b\u044e\u0447\u0438 \u0438 \u0444\u043b\u0430\u0433\u0438, \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 secure boot 2 \u0438 flash encryption. \u0417\u0430\u043f\u0438\u0441\u044c \u043a\u043b\u044e\u0447\u0435\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0440\u0430\u0442\u0438\u043c\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0435\u0439. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u0434\u0430\u0439\u0434\u0436\u0435\u0441\u0442\u0430 \u0438 \u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 efuse \u043e\u0442 \u0437\u0430\u043f\u0438\u0441\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0430\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u0444\u043b\u0430\u0433\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 READONLY \u043a\u043e \u0432\u0441\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043a\u043b\u044e\u0447\u0435\u0439 \u043f\u0440\u0438 \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 secure boot 2 \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0439 \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u0443\u044e \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u043a\u043b\u044e\u0447\u0435\u0439 flash encryption. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0438 flash encryption \u043b\u0438\u0431\u043e \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c (\u0434\u043e \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 secure boot 2), \u043b\u0438\u0431\u043e \u0432 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043c\u043e\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435.<\/p>\n<pre><code class=\"bash\">espefuse.py --port COM1 burn_key flash_encryption .\\dev1s12345\\dev1s12345_flash_encryption_key.bin^ burn_key secure_boot_v2 .\\secure_boot2\\\\digest.bin^ burn_efuse FLASH_CRYPT_CNT 127^ burn_efuse FLASH_CRYPT_CONFIG 0xF^ burn_efuse ABS_DONE_1<\/code><\/pre>\n<ol start=\"9\">\n<li>\n<p><strong>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0448\u0438\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0444\u043b\u0435\u0448-\u043f\u0430\u043c\u044f\u0442\u0438:<\/strong><\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"bash\">esptool.py --port COM1 -b 460800 --after no_reset write_flash --force 0x0 .\\dev1s12345\\dev1s12345_merged_flash.bin<\/code><\/pre>\n<ol start=\"10\">\n<li>\n<p><strong>\u0418 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0433 &#8212; \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 Release mode.<\/strong><\/p>\n<\/li>\n<\/ol>\n<p>\u0417\u0434\u0435\u0441\u044c \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0435\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0440\u0438\u043f\u0442\u043e\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u0430 (\u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 Development node), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430 JTAG \u0438 \u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0431\u043b\u043e\u043a\u0430 \u0441 \u0441\u0435\u0442\u0435\u0432\u044b\u043c MAC. \u0421 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 UART \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0438 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430.<\/p>\n<pre><code class=\"bash\">espefuse.py --port COM3 burn_efuse DISABLE_DL_ENCRYPT 0x1 burn_efuse DISABLE_DL_DECRYPT 0x1 burn_efuse DISABLE_DL_CACHE 0x1 burn_efuse JTAG_DISABLE 0x1 write_protect_efuse MAC write_protect_efuse RD_DIS write_protect_efuse DISABLE_DL_ENCRYPT<\/code><\/pre>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0436\u043d\u044b\u0445 \u0444\u0430\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0415\u0441\u043b\u0438 \u0437\u0430\u043c\u0435\u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0438\/\u0438\u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u041f\u041e \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430, \u0442\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u0414\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u041f\u041e \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c OTA \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c (\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f). \u0412 \u0434\u0440\u0443\u0433\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0437\u0430\u043c\u0435\u043d\u044b \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 <strong>dev1s12345_fctry_partition_enc.bin<\/strong>. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u043d\u043e\u0432\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f NVS-\u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u0444\u0430\u0439\u043b\u0435 <strong>.\\dev1s12345\\keys\\dev1s12345_nvs_key.bin<\/strong>. \u0412\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043a\u043b\u044e\u0447\u0438 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c.\u00a0<\/p>\n<p>\u0414\u043b\u044f \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u044f \u043c\u0435\u0440 \u0437\u0430\u0449\u0438\u0442\u044b \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0432 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u041f\u041e \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e \u201c\u0432\u043e\u0437\u0434\u0443\u0445\u0443\u201d (OTA) \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 ESP32 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043b (\u0434\u0430\u0436\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442) \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438\/\u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u041f\u041e \u0447\u0435\u0440\u0435\u0437 UART. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432 \u0440\u0430\u043d\u0442\u0430\u0439\u043c\u0435 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"cpp\">esp_efuse_disable_rom_download_mode() <\/code><\/pre>\n<ol start=\"11\">\n<li>\n<p><strong>\u0412 \u0444\u0438\u043d\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0438\u0437 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 ESP32.<\/strong><\/p>\n<\/li>\n<\/ol>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0439 NVS-\u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">static esp_err_t custom_nvs_part_init(const char *name) { #if CONFIG_NVS_ENCRYPTION     esp_err_t ret = ESP_FAIL;     const esp_partition_t *key_part = esp_partition_find_first(                                           ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_NVS_KEYS, NULL);     if (key_part == NULL) {         ESP_LOGE(TAG, \"CONFIG_NVS_ENCRYPTION is enabled, but no partition with subtype nvs_keys found in the partition table.\");         return ret;     }     nvs_sec_cfg_t cfg = {};     ret = nvs_flash_read_security_cfg(key_part, &amp;cfg);     if (ret != ESP_OK) {         \/* We shall not generate keys here as that must have been done in default NVS partition initialization case *\/         ESP_LOGE(TAG, \"Failed to read NVS security cfg: [0x%02X] (%s)\", ret, esp_err_to_name(ret));         return ret;     }     ret = nvs_flash_secure_init_partition(name, &amp;cfg);     if (ret == ESP_OK) {         ESP_LOGI(TAG, \"NVS partition \\\"%s\\\" is encrypted.\", name);     }else ESP_LOGE(TAG, \"Failed to init NVS partition: [0x%02X] (%s)\", ret, esp_err_to_name(ret));     return ret; #else     return nvs_flash_init_partition(name); #endif }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0438\u0437 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e NVS-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0438 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0438\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438:<\/p>\n<pre><code class=\"cpp\">int alloc_and_read_from_nvs(nvs_handle handle, const char *key, char **value) {     size_t required_size = 0;     if ((nvs_get_blob(handle, key, NULL, &amp;required_size)) != ESP_OK) return -1;     *value = calloc(1, required_size + 1);  \/* The extra byte is for the NULL termination *\/     if (*value) {         nvs_get_blob(handle, key, *value, &amp;required_size);         return 0;     }     return -1; }<\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0435, \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438. <\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/797819\/\"> https:\/\/habr.com\/ru\/articles\/797819\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0426\u0435\u043b\u044c \u0441\u0442\u0430\u0442\u044c\u0438 &#8212; \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0439 Iot-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u043b\u044f \u0441\u0435\u0442\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u0431\u0430\u0437\u0435 ESP32 \u0438 \u043e\u0431\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c.\u00a0<\/p>\n<p>\u041e\u0431\u0449\u0443\u044e \u0438\u0434\u0435\u044e \u0438 \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b \u043d\u0430 \u0442\u0435\u043c\u044b:<\/p>\n<ul>\n<li>\n<p>\u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 mosquitto SSL\/TLS \u0438\u0437 docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p>\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0434\u043b\u044f \u0431\u0440\u043e\u043a\u0435\u0440\u0430 Mosquitto SSL \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 ESP32<\/p>\n<\/li>\n<li>\n<p>\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0434\u043b\u044f ESP32 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0437\u0430\u0449\u0438\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0437\u0430\u0449\u0438\u0442\u044b \u0434\u043b\u044f ESP32 &#8212; Secure Boot 2, Flash Encryption, NVS Encryption<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0442\u0430\u043a, \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435. \u0414\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 MQTT-\u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 ESP32 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b. \u041c\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 \u043b\u043e\u0433\u0438\u043d\u043e\u0432\/\u043f\u0430\u0440\u043e\u043b\u0435\u0439\u00a0 \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432 Mosquitto. \u0412\u043c\u0435\u0441\u0442\u043e \u043f\u0430\u0440\u044b \u043b\u043e\u0433\u0438\u043d\/\u043f\u0430\u0440\u043e\u043b\u044c Mosquitto \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 CN \u0432 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u0445. \u041d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0438 (Flash encryption + NVS encryption) \u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0442\u044c \u0438\u0445\u00a0 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0441 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u043e\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b (\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0437\u0430\u0449\u0438\u0442\u0438\u043c \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Secure Boot 2). \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435\u0442 \u0446\u0435\u043b\u0438 \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u0442\u0438\u043f\u043e\u0432\u044b\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432, \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u044f \u0440\u0438\u0441\u043a\u043e\u0432 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0435\u0442\u0430\u0446\u0438\u0438 CA \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u044d\u0442\u0438\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0443\u0440\u0430.<\/p>\n<p>\u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435.<\/p>\n<h4>\u041f\u0435\u0440\u0432\u044b\u043c \u044d\u0442\u0430\u043f\u043e\u043c \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c Mosquitto SSL<\/h4>\n<p>\u041c\u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c docker compose. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0436\u0435 \u0441 \u043f\u0435\u0440\u0432\u044b\u0445 \u043f\u0440\u043e\u0431\u043d\u044b\u0445 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043b\u0435\u0433\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u041d\u0438\u0436\u0435 \u044f \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0441\u044c \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0438 \u0438\u043c\u0435\u044e\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f docker.<\/p>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0444\u0430\u0439\u043b \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b mosquitto docker-compose.yml.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u043e\u0440\u0442 8883 \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u0438\u0440\u043e\u043c. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0443\u043a\u0430\u0436\u0435\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449 mosquitto.<\/p>\n<pre><code class=\"yaml\">version: '3.8'  services:     mosquitto:         image: eclipse-mosquitto:2         ports:             - 8883:8883             - 9001:9001         volumes:             - .\/mosquitto\/config:\/mosquitto\/config\/             - .\/mosquitto\/data:\/mosquitto\/data\/             - .\/mosquitto\/log:\/mosquitto\/log\/             - .\/mosquitto\/certs:\/mosquitto\/certs\/         networks:             - mosquitto networks:     mosquitto:         name: mosquitto         driver: bridge<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435, \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e mosquitto, \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043d\u0430\u0448\u0435\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438. <\/p>\n<p>\u0424\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 <strong>mosquitto.conf<\/strong><\/p>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0432\u0430\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b:<\/p>\n<pre><code class=\"bash\"># \u0445\u0440\u0430\u043d\u0438\u043c \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u043e \u0438 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 persistence true # \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0442\u0438\u043f\u044b \u043b\u043e\u0433\u043e\u0432 (\u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0445 error, warning, notice and information) log_type # \u0412 \u043b\u043e\u0433\u0430\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438  log_timestamp_format %Y-%m-%dT%H:%M:%S # \u0417\u0430\u043f\u0440\u0435\u0442\u0438\u043c \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f: allow_anonymous false # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u0430 8883 \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435: # MQTT over TLS listener 8883 # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432: require_certificate true # \u0418\u0441\u043a\u043b\u044e\u0447\u0438\u043c \u043a\u043b\u043e\u043d\u044b \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432: use_username_as_clientid true # \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0431\u0440\u043e\u043a\u0435\u0440\u0443, \u0447\u0442\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c CN \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 username: use_identity_as_username true  # \u0423\u043a\u0430\u0436\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b CA, \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043b\u044e\u0447 \u0441\u0435\u0440\u0432\u0435\u0440\u0430: cafile \/mosquitto\/certs\/ca.crt certfile \/mosquitto\/certs\/server.crt keyfile \/mosquitto\/certs\/server.key  <\/code><\/pre>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u044b.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u044f \u0442\u043e\u043f\u0438\u043a\u043e\u0432, \u0442\u043e mosquitto \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0432\u0435\u0441\u0442\u0438 \u043a\u0440\u0430\u0441\u043e\u0442\u0443 \u0432 \u0432\u043e\u043f\u0440\u043e\u0441\u0435 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0442\u043e\u043f\u0438\u043a\u043e\u0432. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f ACL-\u0444\u0430\u0439\u043b \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0430\u043c\u0438. \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 <strong>mosquitto.conf<\/strong><\/p>\n<pre><code class=\"bash\">acl_file my_acl_file_01<\/code><\/pre>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b \u0434\u043b\u044f \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u0438 \u0447\u0442\u043e \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e &#8212; \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0432 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0435 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 <strong>client id<\/strong> \u0438\u043b\u0438 <strong>username<\/strong>. \u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0442\u043e\u043f\u0438\u043a, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 <strong>username<\/strong>:<\/p>\n<pre><code class=\"bash\">pattern write my_sensor\/%u\/data<\/code><\/pre>\n<p>\u042d\u0442\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 ACL \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0435\u0440\u0432\u0438\u0441\u0443-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0432 \u0442\u043e\u043f\u0438\u043a\u0435 \u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f (\u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0431\u0440\u043e\u043a\u0435\u0440 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0438\u0437 CN \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430) \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 (\u0442.\u0435. \u0431\u0435\u0437 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u0438) \u0441\u0442\u0440\u043e\u0433\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u043f\u0438\u043a\u043e\u0432 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u042d\u0442\u0438 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0441\u0435\u0442\u0438 \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0442\u0438\u043f\u0430 mosquitto-bridge, NiFi \u0438\/\u0438\u043b\u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u043f\u043e\u0442\u043e\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0438\u043c-\u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0443 (Kafka \u0438 \u0442.\u043f.).\u00a0<\/p>\n<h3>\u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432<\/h3>\n<p>\u0427\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e?\u00a0<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c CA (\u043e\u0447\u0435\u043d\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u0438 \u043e\u0447\u0435\u043d\u044c \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442)<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043a\u043b\u044e\u0447 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 CA)<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a\u043b\u044e\u0447\u0435\u0439-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u0432.<\/p>\n<\/li>\n<\/ol>\n<p>\u041f\u043f 1 \u0438 2 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0440\u0443\u043a\u0430\u043c\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u0441\u0443\u0442\u0438 \u0442\u0438\u043f\u043e\u0432\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f CA \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0430\u043c\u043e\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b. \u0414\u043b\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0439 \u0441\u0435\u0442\u0438 \u044d\u0442\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0441\u0430\u043c\u043e\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u043e\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0442\u0435\u043c, \u0447\u0442\u043e \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0435 \u041f\u041e, \u0442\u0430\u043a\u043e\u0435 \u043a\u0430\u043a \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u044b \u0438 \u0442.\u043f. \u041e\u0434\u043d\u0430\u043a\u043e, \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u0439 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0439 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0439 \u0441\u0435\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 (\u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0434\u0440\u0443\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c) \u0446\u0435\u043f\u043e\u0447\u0435\u043a \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u0438 \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u043f\u044b\u0442 &#8212; \u0432\u0440\u0435\u0434\u043d\u043e.\u00a0<\/p>\n<h4>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c CA<\/h4>\n<p>\u0420\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0445\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043f\u043e\u043b\u043e\u0436\u0438\u043c \u0432 ~\/server\/. \u0414\u043b\u044f CA \u0431\u0443\u0434\u0435\u0442~\/ca\/.<\/p>\n<p>\u041a\u043b\u044e\u0447 CA (\u0431\u0435\u0437 passphrase):<\/p>\n<pre><code class=\"bash\">openssl genrsa -out ca\/ca.key 2048<\/code><\/pre>\n<p>\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 CA (\u043d\u0430 30 \u043b\u0435\u0442):<\/p>\n<pre><code class=\"bash\">openssl req -new -x509 -days 10950 -key ca\/ca.key -out ca\/ca.crt<\/code><\/pre>\n<pre><code class=\"bash\">You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Moscow Locality Name (eg, city) []:Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]:Leo4 Organizational Unit Name (eg, section) []:iot Common Name (e.g. server FQDN or YOUR name) []:iot.leo4.ru Email Address []:iot@leo4.ru<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 CA \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:  <\/p>\n<pre><code class=\"bash\">cp ca\/ca.crt certs\/ca.crt<\/code><\/pre>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043b\u044e\u0447 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0431\u0440\u043e\u043a\u0435\u0440\u0430:<\/p>\n<pre><code class=\"bash\">mkdir server sudo openssl genrsa -out server\/server.key 2048<\/code><\/pre>\n<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 CA:<\/p>\n<pre><code class=\"bash\">oleg@leo4broker2:sudo openssl req -new -out server\/server.csr -key server\/server.key You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Moscow Locality Name (eg, city) []:Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]:Leo4 Organizational Unit Name (eg, section) []:mqtt-broker Common Name (e.g. server FQDN or YOUR name) []:iot.leo4.ru Email Address []:iot@leo4.ru  Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:. An optional company name []:.<\/code><\/pre>\n<p>\u0412\u044b\u0434\u0430\u0434\u0438\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430:<\/p>\n<pre><code class=\"bash\">oleg@leo4broker2:~$ sudo openssl x509 -req -in server\/server.csr -CA ca\/ca.crt -CAkey ca\/ca.k ey -CAcreateserial -out server\/server.crt -days 10950 Certificate request self-signature ok subject=C = RU, ST = Moscow, L = Moscow, O = Leo4, OU = mqtt-broker, CN = iot.leo4.ru, emailAddress = iot@leo4.ru<\/code><\/pre>\n<p>\u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0432 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u043f\u0430\u043f\u043a\u0443, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:<\/p>\n<pre><code class=\"bash\">oleg@mqtt:~\/server$ ls server.crt  server.csr  server.key oleg@mqtt:~$ cp ca\/ca.crt mosquitto\/certs\/ oleg@mqtt:~$ cp server\/server.crt mosquitto\/certs\/ oleg@mqtt:~$ cp server\/server.key mosquitto\/certs\/ cp: cannot open 'server\/server.key' for reading: Permission denied oleg@mqtt:~$ sudo cp server\/server.key mosquitto\/certs\/ oleg@mqtt:~$ cd mosquitto oleg@mqtt:~\/mosquitto$ ls certs  config  data  etc  log oleg@mqtt:~\/mosquitto$ cd certs oleg@mqtt:~\/mosquitto\/certs$ ls ca.crt  server.crt  server.key<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441 Mosquitto:<\/p>\n<pre><code class=\"bash\">oleg@mqtt:~$ sudo docker compose up -d [+] Running 4\/4  \u2714 mosquitto 3 layers [\u28ff\u28ff\u28ff]      0B\/0B      Pulled                          4.5s    \u2714 c926b61bad3b Pull complete                                              0.6s    \u2714 a87e6a8c3b38 Pull complete                                              0.6s    \u2714 4e2ff55c815a Pull complete                                              0.5s [+] Running 1\/2 Network mosquitto           Created                          1.0s  \u2714 Container oleg-mosquitto-1  Started<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430:<\/p>\n<pre><code class=\"bash\">oleg@mqtt:~$ sudo docker compose ps NAME               IMAGE                 COMMAND                  SERVICE     CREATED          STATUS          PORTS oleg-mosquitto-1   eclipse-mosquitto:2   \"\/docker-entrypoint....\"   mosquitto   43 minutes ago   Up 12 minutes   0.0.0.0:8883->8883\/tcp, :::8883->8883\/tcp, 1883\/tcp, 0.0.0.0:9001->9001\/tcp, :::9001->9001\/tcp<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043c\u0438\u0440\u0430 \u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0441\u0435\u0440\u0432\u0435\u0440\u0430:<\/p>\n<pre><code class=\"bash\">D:\\OpenSSL-Win64\\bin>openssl s_client -connect iot.leo4.ru:8883 CONNECTED(000001E0) depth=1 C = RU, ST = Moscow, L = Moscow, O = Leo4, OU = IT, CN = iot.leo4.ru, emailAddress = iot@leo4.ru verify error:num=19:self-signed certificate in certificate chain verify return:1 depth=1 C = RU, ST = Moscow, L = Moscow, O = Leo4, OU = IT, CN = iot.leo4.ru, emailAddress = iot@leo4.ru verify return:1 depth=0 C = RU, ST = Moscow, L = Moscow, O = Leo4, OU = mqtt, CN = iot.leo4.ru, emailAddress = iot@leo4.ru verify return:1 --- Certificate chain  0 s:C = RU, ST = Moscow, L = Moscow, O = Leo4, OU = mqtt, CN = iot.leo4.ru, emailAddress = iot@leo4.ru    i:C = RU, ST = Moscow, L = Moscow, O = Leo4, OU = IT, CN = iot.leo4.ru, emailAddress = iot@leo4.ru    a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256    v:NotBefore: Jan 25 13:56:50 2024 GMT; NotAfter: Jan 17 13:56:50 2054 GMT  1 s:C = RU, ST = Moscow, L = Moscow, O = Leo4,<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-369850","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/369850","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=369850"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/369850\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=369850"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=369850"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=369850"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}