安全与 TLS

  • security
  • TLS
  • ESP-TLS
  • HTTPS
  • WSS
  • ESP32-S3
  • Flash encryption
  • eFuse
  • DIS_DOWNLOAD_MANUAL_ENCRYPT
  • SPI_BOOT_CRYPT_CNT
  • esptool
  • --encrypt
  • Flash 加密
  • 加密中断
  • 无法启动
  • 开发模式
  • 量产模式

ESP-TLS 如何跳过服务器证书校验?

在 ESP32 的 ESP-TLS 中,可以通过配置启用“跳过服务器证书校验”功能,用于测试阶段快速建立 HTTPS / WSS 连接。

在 menuconfig 中启用以下选项:

  • CONFIG_ESP_TLS_INSECURE
  • CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY

esp_tls_config

启用后,如果 esp_tls_cfg_t 中没有配置以下任一服务器验证方式,ESP-TLS 会自动跳过服务器证书验证:

  • cacert_buf
  • use_global_ca_store
  • crt_bundle_attach

参考代码:

esp_tls_cfg_t cfg = {
    .cacert_buf = NULL,
    .use_global_ca_store = false,
    .crt_bundle_attach = NULL,
    .timeout_ms = 10000,
};

安全风险说明:

  • 无法验证服务器身份。
  • 容易遭受中间人攻击(MITM)。
  • 设备可能连接到伪造服务器。
  • 数据可能被窃听或篡改。

注意事项:

  • 该功能仅适用于测试环境。
  • 不建议用于生产环境。
  • 不应在公网或不可信网络中使用。
  • 生产环境应优先使用 CA 证书或证书 bundle 进行验证。

ESP32-S3 Flash 加密中断后无法启动,如何判断原因并恢复?

原因分析:
该问题通常与以下两种情况有关:

  1. 烧录异常:供电不稳定等因素可能导致写入的固件异常,进而使 Flash 加密校验失败。即使未启用加密,烧录异常也可能导致设备无法启动。
  2. 加密过程中断电:固件烧录完成后,芯片还会执行 Flash 加密。若此时立即断电,加密流程可能中断并导致固件损坏,设备再次上电后无法正常启动。

如果 eFuse 中 “Enables flash encryption when 1 or 3 bits are set” 对应的标志位已改写为 “Enable R/W 0b001”,设备将不再接受明文固件。

解决方案:
能否恢复取决于 eFuse 位 DIS_DOWNLOAD_MANUAL_ENCRYPT 是否已禁用:

  • 开发模式下,该位未禁用,可使用 esptool 的 --encrypt 参数重新烧录。芯片会在下载过程中使用内部密钥加密写入 Flash,主机无需获取密钥。
  • 量产模式下,该位已永久禁用,设备只接受密文固件。若主机未保留密钥,则无法再次烧录,设备将无法恢复。

烧录命令如下:

esptool.exe --port COMx --baud 921600 --before default_reset --after hard_reset write_flash --flash_mode dio --flash_freq 80m --flash_size detect --encrypt 0x0 <固件路径>

补充说明:

DIS_DOWNLOAD_MANUAL_ENCRYPT 为 0 表示未禁止下载模式加密,为 1 表示已禁止,不能将位名中的 DIS 与“该位被禁用”混淆。上述恢复方法还要求 ROM 下载模式及相关下载功能可用。原稿中的“无法恢复”针对加密中断、设备已无法启动且主机未保留密钥的场景;能正常运行的加密设备仍可通过受支持的 OTA 流程更新固件。参考 ESP32-S3 Flash 加密官方说明。