ESP-TLS-mbedTLS: mbedtls_x509_crt_parse returned -0x2180 beheben
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:
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 failedLö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:
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 x509 -in cert_esp32.pem -noout -textum 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.