最新消息:

ESP32踩坑之HTTPS Server

嵌入式 ZmmFly 229浏览 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,您需要填写昵称和邮箱!

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