安全

[English]


ESP8266 的固件是否能被读取?

ESP8266 固件由于放置在外部 flash,数据可被外部读取。并且 ESP8266 不支持 flash 加密,所有数据均为明文。


ESP8285 是否可以固件加密?

  • ESP8285 芯片自身未有固件加密功能,无法完成固件加密。

  • ESP32 以及 ESP32-S2 芯片都有具备固件加密功能。

  • 也可选择外置加密芯片来完成部分数据加密。


secure boot v1 和 secure boot v2 的区别?

当前,仅 ESP32 ECO3 以下版本推荐使用 secure boot v1,ESP32 ECO3 及以上、ESP32-C3、ESP32-S2 和 ESP32-S3 推荐使用 secure boot v2

secure boot v2 相较于 secure boot v1 主要做了以下方面的改进: - bootloader 和 app 使用相同的签名格式。 - bootloader 和 app 使用统一的签名密钥。


开启 secure boot 后,编译报错缺少文件?

错误 log:/Makefile.projbuild:7:/f/ESP32Root/secure_boot_signing_key.pem。

报错原因:security boot 是固件签名校验的功能,该功能需要生成密钥对。 - 启用 secure boot v1 时生成密钥对的方法请参考 secure boot v1 生成密钥。 - 启用 secure boot v2 时生成密钥对的方法请参考 secure boot v2 生成密钥


模组使能 secure boot 后是否可以再次烧录?

  • secure boot v1 配置为 one-time,那么就只能烧录一次,不可以再重新烧录 bootloader 固件。

  • secure boot v1 配置为 reflashable,则可以重新烧录 bootloader 固件。

  • secure boot v2 允许重新烧录 bootloader 和 app 固件。


模组使能 flash encrypted,重新烧录后出现 flash read error 错误。如何解决?

模组开启加密功能后将不支持明文固件烧录,常见的错误请参考 重新烧录可能出现的错误。可以通过 espefuse 脚本将加密关闭后再次烧录明文数据,或者参考`示例 <https://github.com/espressif/esp-idf/tree/master/examples/security/flash_encryption>`_将加密后的固件数据烧录到设备上。

注解

flash encrypted 加密开关存在次数限制。


ESP32 打开 flash 加密和 secure boot 后,如何关闭?

  • 如果您使用的是 one-time flash (Release) 模式,那么 flash 加密和 secure boot 都是不能关闭的。

  • 如果您使用的是 reflashable (Development (NOT SECURE)) 模式,那么 flash 加密可以关闭,请参见 关闭 Flash 加密;secure boot 不能关闭。


ESP32 保护固件安全的方式有那些?


ESP32 启动 flash 加密后进行 GDB 调试,为何会不断复位重启?

  • ESP32 启动了 flash 加密或 secure Boot 后,默认将会禁用 JTAG 调试,请参见说明 注意事项和补充内容

  • 可以通过 esptool 工具包中的 espefuse.py summary 脚本指令读取当前芯片 JTAG 状态。


ESP32 芯片如何开启 Flash 加密?

  • 在 ESP-IDF 编译配置中修改,通过 make menuconfigidf.py menuconfig –> Security features –> Enable flash encryption on boot (READ DOCS FIRST)

  • 请参见 Flash 加密说明


ESP32 的 GPIO0 拉低后无法进入下载模式,日志打印 “download mode is disable” 是什么原因?

  • ESP32 芯片上电打印 “download mode is disable” 日志,说明该芯片的 UART 下载模式 (UART download mode) 已被禁用,您可以通过检查该芯片的 efuse 中的 UART_DOWNLOAD_DIS 位检查该模式是否被禁用。

  • 注意,当启用 flash 加密的量产模式后,UART 下载模式将默认被禁用,更多信息请参考 UART ROM download mode


在 Arduino 开发环境中使用 ESP32 能开启 secure boot 功能吗?

  • 不能,如果要使用 arduino 进行开发,开启这种功能的唯一方法是使用 Arduino 作为 IDF 组件。


secure boot 和 flash 加密的使用场景?

  • 启用 secure boot 后,设备将仅加载运行指定密钥签名后的固件。因此,启用 secure boot 可以避免设备加载非法的固件、防止对设备刷写未经授权的固件。

  • 启用 flash 加密后,flash 上存储固件的分区以及被标识为 “encrypeted” 的分区中的数据将被加密。因此,启用 flash 加密可以避免 flash 上的数据被非法查看,并且从 flash 上拷贝的固件数据无法应用到其他设备上。


secure boot 和 flash 加密中涉及的存储在 eFuse 数据有哪些?


启用 secure boot 失败,提示 “Checksum failure”,怎么解决?

  • 启用 secure boot 后,bootloader.bin 的大小将增大,请检查引导加载程序分区的大小是否足够存放编译得到的 bootloader.bin。更多说明请参考 引导加载程序大小

启用 NVS 加密失败,提示 nvs: Failed to read NVS security cfg: [0x1117] (ESP_ERR_NVS_CORRUPT_KEY_PART),怎么解决?

  • 启用 NVS 加密前,建议先擦除一次 flash,然后烧录包含使能 NVS 加密的固件。

启用 flash 加密后,提示 esp_image: image at 0x520000 has invalid magic byte (nothing flashed here),怎么解决?

  • 启用 flash 加密后,将尝试对所有 app 类型的分区的数据进行加密,当 app 分区中没有存储对应的 app 固件时,将提示该 log。您可以在启用 flash 加密时对所有 app 类型的分区烧录预编译的 app 固件来避免出现这种警告。

使能 CONFIG_EFUSE_VIRTUAL 选项后,开启 flash 加密,为何相关数据未被加密?

  • Virtual eFuses 功能目前仅仅用于测试 eFuse 数据的更新,启用该功能后,flash 加密功能并未完全开启。

可以向一个未使能 flash 加密的设备中通过 OTA 更新一个使能了 flash 加密的 app 固件吗?

  • 可以,请在编译时取消选中 Check Flash Encryption enabled on app startup

如何撤销 secure boot 的 key?

  • 撤销 secure boot key 的操作是在 new_app.bin 固件中完成的。首先 new_app.bin 必须附带两个签名。然后,下发 new_app.bin 到设备上。最后,当旧的签名校验通过后,通过 new_app.bin 中的 esp_ota_revoke_secure_boot_public_key() 执行撤销旧 key 的操作。注意,如果您使用了 OTA 回滚方案,请在 esp_ota_mark_app_valid_cancel_rollback() 返回 ESP_OK 后再调用 esp_ota_revoke_secure_boot_public_key()。 更多说明请参考 Key Revocation

启用 secure boot 或者 flash 加密(开发模式)后,无法烧录新固件,提示 Failed to enter Flash download mode,怎么解决?

  • 这种提示通常代表您使用的烧录命令不正确。请使用 idf.py 脚本执行 idf.py bootloaderidf.py app 命令编译 bootloader.binapp.bin。然后根据编译后的提示使用 idf.py 执行烧录命令。如果还不能烧录程序,请使用 espefuse.py -p PORT summary 命令查看当前设备的 eFuse,并检查 flash download mode 是否是 enable 状态。


没找到答案?
请前往 ESP 论坛ESP GitHub 发现更多信息吧!

对本文档有建议?提交文档反馈