ESP-TLS-mbedTLS: mbedtls_x509_crt_parse returned -0x2180 beheben

English Deutsch

Problem:

Beim Versuch, TLS auf dem ESP32 zu verwenden, nutzt du ein Zertifikat und einen privaten Schlüssel, z.B. aus NVS oder vom Dateisystem. Wenn du jedoch versuchst, eine SSL-Verbindung herzustellen, werden Fehlermeldungen wie die folgende angezeigt:

mbedtls_x509_parse_error.txt
E (9774) esp-tls-mbedtls: mbedtls_x509_crt_parse returned -0x2180
E (9775) esp-tls-mbedtls: Failed to set server pki context
E (9775) esp-tls-mbedtls: Failed to set server configurations, returned [0x8015] (ESP_ERR_MBEDTLS_X509_CRT_PARSE_FAILED)
E (9786) esp-tls-mbedtls: create_ssl_handle failed, returned [0x8015] (ESP_ERR_MBEDTLS_X509_CRT_PARSE_FAILED)
E (9795) esp_https_server: esp_tls_create_server_session failed

Lösung

-0x2180 bedeutet MBEDTLS_ERR_X509_INVALID_FORMAT

Das häufigste Problem hierbei ist, dass conf.cacert_len und conf.prvtkey_len den NUL-Terminator in der Länge enthalten müssen.

Funktionsfähiges Beispiel:

mbedtls_len_example.cpp
conf.cacert_pem = (const uint8_t*)cert.c_str();
conf.cacert_len = this->cert.size() + 1;

conf.prvtkey_pem = (const uint8_t*)privkey.c_str();
conf.prvtkey_len = this->privkey.size() + 1;

Beachte das + 1 hier: Ohne das + 1 erhältst du den Fehler mbedtls_x509_crt_parse returned -0x2180

Weitere Ursachen:

Wenn die Länge nicht das Problem ist, hast du wahrscheinlich ein fehlerhaftes Zertifikat. Ich empfehle, den Inhalt des Zertifikats über die serielle Schnittstelle auszugeben, in einer Datei namens cert_esp32.pem zu speichern und dann folgendes auszuführen:

openssl_check_cert.sh
openssl x509 -in cert_esp32.pem -noout -text

um zu überprüfen, ob das Zertifikat korrekt ist. Dasselbe kannst du für den privaten Schlüssel tun, aber in der Regel sind entweder beide — der private Schlüssel und das Zertifikat — in Ordnung oder beide nicht.


Check out similar posts by category: C/C++, Embedded, ESP8266/ESP32, Networking