一、问题背景
在ESP32项目开发中,当我兴冲冲地写完HTTPS下载代码,满怀期待地烧录到板子上时,串口监视器却无情地甩给我一连串红色错误... 这篇文章记录了我如何从一脸懵逼到恍然大悟的完整过程。
开发环境:
- 开发板:ESP32-S3-N16R8
- 框架:ESP-IDF
- 需求:从HTTPS服务器下载文件
二、错误现象
运行代码后,串口监视器疯狂输出错误日志:
E (4108) esp-tls-mbedtls: No server verification option set in esp_tls_cfg_t structure
E (4108) esp-tls-mbedtls: Failed to set client configurations, returned [0x8017] (ESP_ERR_MBEDTLS_SSL_SETUP_FAILED)
E (4118) esp-tls: create_ssl_handle failed
E (4128) esp-tls: Failed to open new connection
E (4138) transport_base: Failed to open a new connection
E (4148) HTTP_CLIENT: Connection failed, sock < 0
E (4148) HTTP: ❌ 下载失败: ESP_ERR_HTTP_CONNECT
三、问题分析
经过排查发现ESP-IDF多层配置问题,编译时配置会覆盖运行时配置。
编译时配置(sdkconfig/menuconfig)
- 全局默认行为
- 在编译时确定
运行时配置(代码中config结构体)
- esp_http_client_config_t
- 在运行时配置
关键点: 即使代码中设置了skip_cert_common_name_check = true 如果sdkconfig 中没有启动CONFIG_ESP_TLS_INSECURE的话ESP-TLS底层仍会强制要求证书验证
No server verification option set in esp_tls_cfg_t structure
该错误说明ESP-TLS层在初始化SSL连接时发现既没有提供证书,也没有设置跳过验证的全局选项导致无法建立安全连接
四、解决方案
menuconfig配置
terminal输入idf.menuconfig
Conponent config -> ESP-TLS
具体配置界面如下
五、安全性说明
禁用SSL证书验证会导致: 1.中间人攻击MITM风i西安:无法验证服务器身份 2.数据被窃听风险 3.不符合生产环境要求