最新消息:In this century, entertainment that seeks death can never overcome the heart that seeks knowledge, and our will is immortal.

ESP32踩坑之HTTPS Server

嵌入式 ZmmFly 1160浏览 0评论

解决方法请直接看标题四

一、起因

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

即:

  1. buflen != 0
  2. buf最后一个字节需要为0x00
  3. buf中需要包含-----BEGIN CERTIFICATE-----

通过修改例程, 使用ESP_LOG_BUFFER_HEX输出整个buffer也发现了, 最后一字节为0x00, 而自建的工程中没有
所以, 自建工程中的证书本来是PEM格式, 被当成DER格式解析, 也就有了前面串口抛-0x2180错误的现象

四、解决

对比例程与自建工程发现CMakeLists.txt中有区别, 例程中嵌入文件用的是EMBED_TXTFILES, 自建工程中用的是EMBED_FILES,
EMBED_TXTFILES会在嵌入时自动在文本末尾添加0x00, EMBED_FILES则不会

方法:

  1. 修改EMBED_FILES为EMBED_TXTFILES
  2. 重新分配一个buflen+1的buffer, 复制证书进来再将buf和buflen+1传给https配置,这样即使是EMBED_FILES也可以兼容,但会浪费一些RAM

转载请注明:神奇海域 » ESP32踩坑之HTTPS Server

发表我的评论
取消评论

Protected by WP Anti Spam

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址