ESP-TLS
ESP8266 测试 RTOS SDK mqtt/ssl_mutual_auth
为何连接服务器失败?
出现 SSL 无法连接可能是由于 ESP8266 内存不足导致。
请使用 ESP8266-RTOS-SDK master 版本来测试此例程,master 版本支持在 menuconfig 配置端动态分配内存,可以减少峰值内存的开销,通过 menuconfig ->
Component config
->mbedTLS
->(键 “Y” 使能)Using dynamic TX /RX buffer
->(键 “Y” 使能)Free SSL peer certificate after its usage
->(键 “Y” 使能)Free certificate, key and DHM data after its usage
。
ESP HTTPS 在使用时能跳过服务器证书校验吗?
可以,请在 menuconfig 里使能以下选项:
Menu path: (Top)
->Component config
->ESP-TLS
->Allow potentially insecure options
Menu path: (Top)
->Component config
->ESP-TLS
->Allow potentially insecure options
->Skip server certificate verification by default
同时要确保
esp_http_client_config_t
结构体里不设置cert_pem
成员变量。如果设置了cert_pem
,就仍会用这个设置的 CA 证书校验服务器证书。如果要同时测试 HTTP OTA,还需要在 menuconfig 里使能
Menu path: (Top)
->Component config
->ESP HTTPS OTA
->Allow HTTP for OTA
选项。
如何将 ESP-TLS 中的 esp_tls_conn_read
API 设置成非阻塞模式?或者有其他方式来实现非阻塞?
可以将
esp_tls.h
里esp_tls_cfg_t
结构体里的non_block
设置为 true 来实现非阻塞。也可以调用
esp_transport_connect_async
来实现非阻塞。
ESP-IDF 支持的 TLS 版本有哪些?
ESP-IDF 里推荐的 TLS 协议为 Mbed TLS 协议。
ESP-IDF v5.0 及以上版本不再支持 SSL 3.0,TLS 1.0 和 TLS 1.1,当前支持的 TLS 版本为 TLS 1.2 和 TLS 1.3。
如何分析 SSL 握手会报 “mbedtls_ssl_handshake returned -0x7200” 错误?
0x7200 的错误可能有以下几点:
MBEDTLS_SSL_IN_CONTENT_LEN 过小,一般小于最大 16 K
内存不够
服务器拒绝 ESP 连接,发送的 SSL record 不完整,需要抓包看下, 详情请参考 乐鑫 Wireshark 使用指南。
使用 IP 访问 MQTTS Broker 时出现 MBEDTLS_ERR_X509_CERT_VERIFY_FAILED
错误,但是用同样的条件在 MQTTX 等测试工具中就能成功进行通信,可能是什么原因?
可能是 CN 字段不匹配,可以通过配置成员变量 skip_cert_common_name_check 为 True 来跳过 CN 检查。
ESP32 进行稳定的 TLS 握手需要多少内存?TLS 握手时出现内存不足的问题,如何解决?
TLS 握手通常需要 40~50 KB 的空闲堆内存,用于在握手过程中进行临时分配。如果内存碎片过多或可用内存不足,可能会导致握手失败。内存不足时需要优化内存,可以参考 内存优化 。此外,如果模组带有外部 PSRAM,请确保正确配置以使用该内存。
TLS 握手时出现错误码 0x6900
和 0x7600
,这些错误分别代表什么?
0x6900 (MBEDTLS_ERR_SSL_WANT_READ)
:通常表示操作会被阻塞,因为 TCP 接收缓冲区中暂时没有数据。这不一定是错误,而是表示需要等待更多的数据到达。
0x7600 (MBEDTLS_ERR_SSL_PRIVATE_KEY_REQUIRED)
:表示未设置所需的私钥或预共享密钥。在双向认证的情况下,请确保客户端已经设置了正确的私钥。
在 ESP32 上实现 HTTPS 时,如果服务器证书链与 PC 浏览器获取的不同,应如何解决?
可以尝试在 ESP32 上启用更详细的 mbedtls 调试信息,以获取 TLS 握手过程中服务器发送的证书链,并与浏览器获取的证书链进行对比分析。
在使用 ESP32 时,遇到证书解析失败的问题,应该如何解决?
首先应该检查证书格式是否符合 X509 标准,确保证书链没有问题。此外,打开 mbedtls 的日志功能可以帮助诊断问题所在。
ESP32 出现 TLS 握手失败且服务器证书验证未通过时,应该如何调试?
开启 Mbedtls 的调试功能,记录 TLS 握手的所有活动,包括接收到的服务器证书信息。
MQTTS 服务器是否需要 TLS 认证?
MQTTS 服务器通常需要 TLS 认证。如果想跳过服务器 CA 证书验证,可以将 CA 证书设置为 NULL,并在 menuconfig 中启用
CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY
。
esp-tls: couldn't get hostname for drive.google.com: getaddrinfo() returns 202
如何解决?
该错误表明 DNS 解析失败,可能是由于:
设备的 WiFi 或 LTE 网络未正确连接。
lwIP 仅支持单个 DNS 服务器,多个网络接口(如 WiFi + LTE)可能会导致 DNS 被覆盖,建议检查 DNS 服务器配置。