ESP32 MQTT over SSL

23 views
Skip to first unread message

Beregnyei Balazs

unread,
Oct 7, 2025, 8:56:13 AMOct 7
to elektr...@googlegroups.com
Sziasztok,

Titkosítatlan MQTT-n jól működő esp-idf applikációt állítanék átt SSL-re.
A logok alapján nem egyértelmű, hogy pontosan miféle protokoll hiba áll fenn (lásd lent a hibaüzeneteket).
Az ESP oldali forráskódban ennyi a változás az SSL-re áttérésnél:

  extern const uint8_t server_cert_pem_start[] asm("_binary_ca_crt_start");

  extern const uint8_t server_cert_pem_end[] asm("_binary_ca_crt_end"); // és ugyanez a másik 2 cert/key file-ra is


  mqtt_cfg.broker.address.uri = "mqtts://x.x.x.x:8883";

  mqtt_cfg.broker.verification.certificate = (const char *)server_cert_pem_start;

  mqtt_cfg.credentials.authentication.certificate = (const char *)client_cert_pem_start;

  mqtt_cfg.credentials.authentication.key = (const char *)client_key_pem_start;


...tehát URI-ban mqtt helyett mqtts, és a project folderben megvannak a certificate-ek, amiknek a _start címeivel inicializálom az mqtt client configot.
Makefile-ban is hivatkozva vannak a cert file-ok (különben linker error lenne client_key_pem_start -ra és a másik kettőre is).
Emellett idf.py menuconfigban MQTT es mbedTLS alatt minden fontosnak látszó dolog becsekkolva.
Amikor az ESP megpróbál csatlakozni, szerver oldalon mindössze ennyit kapok:

Oct  7 10:37:22 ivp mosquitto[371798]: 1759826242: New connection from y.y.y.y:63540 on port 8883.

Oct  7 10:37:22 ivp mosquitto[371798]: 1759826242: Client <unknown> disconnected: Protocol error.


ESP oldalon pedig ezt:

I (4623) mbedtls: ssl_tls.c:3087 => handshake

I (4623) mbedtls: ssl_msg.c:2016 => flush output

I (4623) mbedtls: ssl_msg.c:2028 <= flush output

I (4623) mbedtls: ssl_tls.c:3007 client state: MBEDTLS_SSL_HELLO_REQUEST

I (4633) mbedtls: ssl_msg.c:2016 => flush output

I (4633) mbedtls: ssl_msg.c:2028 <= flush output

I (4643) mbedtls: ssl_tls.c:3007 client state: MBEDTLS_SSL_CLIENT_HELLO

I (4653) mbedtls: ssl_client.c:842 => write client hello

W (4663) mbedtls: ssl_tls13_generic.c:1464 Perform PSA-based ECDH computation.

W (4663) mbedtls: ssl_tls13_generic.c:1485 psa_generate_key() returned -27648 (-0x6c00)

I (4673) mbedtls: ssl_client.c:897 <= write client hello

I (4683) mbedtls: ssl_tls.c:3098 <= handshake

E (4683) esp-tls-mbedtls: mbedtls_ssl_handshake returned -0x6C00

I (4693) esp-tls-mbedtls: Certificate verified.

E (4693) esp-tls: Failed to open new connection

E (4703) transport_base: Failed to open a new connection

E (4713) mqtt_client: Error transport connect


Ha valaki látott már ilyet, vagy van bármilyen tippje, kérem ne kíméljen.

Köszönettel,
BB

Beregnyei Balazs

unread,
Oct 7, 2025, 6:06:28 PMOct 7
to elektr...@googlegroups.com

Saját magamnak válaszolva:

1)
A kiinduló hiba (psa_generate_key() returned -27648) egy ismert mbedTLS bug volt, elfelejtették meghívni a psa_crypto_init()-et, mielőtt psa_generate_key()-t először használják.

2)
Ezután jött egy "esp-tls-mbedtls: Failed to verify peer certificate", de ez csak azért volt, mert URL-nek IP címet adtam, márpedig a cert egy adott domain-hez tartozik, szóval URL javítással ezen is túljutottam.

3)
Ezután mqtt_task stack overflow lett, mert a default MQTT stack méret nem volt elég neki, megnöveltem.

4)
És itt még mindig el vagyok akadva: 

  E (9355) transport_base: esp_tls_conn_read error, errno=Connection already in progress

  E (9355) mqtt_client: esp_mqtt_handle_transport_read_error: transport_read() error: errno=119

  E (9365) mqtt_client: esp_mqtt_connect: mqtt_message_receive() returned -1

  E (9375) mqtt_client: MQTT connect failed


Elvileg konkurens MQTT hívásaim vannak (amit kétlek, de majd kilaborozom), és ez már nem kifejezetten SSL hibaüzenet.

Üdv,
BB

Beregnyei Balazs

unread,
Oct 14, 2025, 7:07:57 AM (12 days ago) Oct 14
to elektr...@googlegroups.com

Megoldódott, néhány nap küzdés után meglepő dolog derült ki az alábbi hibaüzenet okáról:


  E (9355) transport_base: esp_tls_conn_read error, errno=Connection already in progress

  E (9355) mqtt_client: esp_mqtt_handle_transport_read_error: transport_read() error: errno=119


Bár a hibaüzenet konkurens MQTT hívásokra utalt, ilyen nem volt a kódban, valamint a heap is elegendő volt. 
Végül kiderült, hogy a hiba a menuconfig-ban volt, be volt kapcsolva a Component config -> mbedTLS -> mbedTLS 3.x related -> Support TLS 1.3.
Kikapcsoltam, és láss csodát, minden működik.
Fura, hogy egy nem túl friss esp-idf magasabb verziót támogat a TLS-ből, mint a friss linux szerver, és hogy a hibakezelés ennyire zavaróan van megoldva (vagyis sehogy).

Üdv,
BB
Reply all
Reply to author
Forward
0 new messages