如何修复 esp-tls-mbedtls: mbedtls_x509_crt_parse returned -0x2180

问题:

尝试在 ESP32 上使用 TLS 时,你使用例如来自 NVS 或文件系统的证书和私钥。但是当你尝试使用 SSL 连接时,你看到类似这样的错误消息

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

解决方案

-0x2180 表示 MBEDTLS_ERR_X509_INVALID_FORMAT

这里最常见的问题是 conf.cacert_lenconf.prvtkey_len 必须在长度中包含 NUL 终止符。

工作示例:

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;

注意这里的 + 1:没有 + 1,你将看到 mbedtls_x509_crt_parse returned -0x2180

其他原因:

如果长度不是问题,你可能有格式错误的证书。我建议通过串口打印证书内容,将其保存到我们称为 cert_esp32.pem 的文件中,然后运行

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

以验证证书是否正确。你可以对私钥做同样的操作,但通常要么私钥和证书正常,要么都不正常。


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