解决方法请直接看标题四
一、起因
SoftAP 建立HTTPS Server提供web页面用于配置
二、问题
打开192.168.4.1时,串口连续抛出
I (16690) esp_https_server: performing session handshake E (16691) esp-tls-mbedtls: mbedtls_x509_crt_parse returned -0x2180 E (16692) esp-tls-mbedtls: Failed to set server pki context E (16699) esp-tls-mbedtls: Failed to set server configurations E (16705) esp-tls-mbedtls: create_ssl_handle failed E (16711) esp_https_server: esp_tls_create_server_session failed W (16717) httpd: httpd_accept_conn: session creation failed W (16725) httpd: httpd_server: error accepting new connection
查看mbedtls定义, -0x2180
为证书格式不正确,但是直接编译idf中的例程是没有问题的
将工程中的证书替换为https_server例程的证书和秘钥,问题依旧,就此卡主…
三、解析
先放一放,过了一个星期,查看mbedtls源码,发现问题所在,
int mbedtls_x509_crt_parse( mbedtls_x509_crt *chain, const unsigned char *buf, size_t buflen )
这个函数当中, 如下所示第二行, DER和PEM格式判别逻辑中, 如果判别为PEM格式需要满足3个条件
#if defined(MBEDTLS_PEM_PARSE_C)
if( buflen != 0 && buf[buflen - 1] == '\0' &&
strstr( (const char *) buf, "-----BEGIN CERTIFICATE-----" ) != NULL )
{
buf_format = MBEDTLS_X509_FORMAT_PEM;
}
if( buf_format == MBEDTLS_X509_FORMAT_DER )
return mbedtls_x509_crt_parse_der( chain, buf, buflen );
#else
return mbedtls_x509_crt_parse_der( chain, buf, buflen );
#endif
即:
- buflen != 0
- buf最后一个字节需要为0x00
- buf中需要包含
-----BEGIN CERTIFICATE-----
通过修改例程, 使用ESP_LOG_BUFFER_HEX
输出整个buffer也发现了, 最后一字节为0x00, 而自建的工程中没有
所以, 自建工程中的证书本来是PEM格式, 被当成DER格式解析, 也就有了前面串口抛-0x2180
错误的现象
四、解决
对比例程与自建工程发现CMakeLists.txt中有区别, 例程中嵌入文件用的是EMBED_TXTFILES
, 自建工程中用的是EMBED_FILES
,
即EMBED_TXTFILES
会在嵌入时自动在文本末尾添加0x00, EMBED_FILES
则不会
方法:
- 修改EMBED_FILES为EMBED_TXTFILES
- 重新分配一个buflen+1的buffer, 复制证书进来再将buf和buflen+1传给https配置,这样即使是EMBED_FILES也可以兼容,但会浪费一些RAM
转载请注明:神奇海域 » ESP32踩坑之HTTPS Server