Merge branch 'docs/update_cn_trans_for_secure_boot_v2' into 'master'

docs: Update CN translation for secure-boot-v2.rst

Closes DOC-9082

See merge request espressif/esp-idf!33895
This commit is contained in:
Aditya Patwardhan
2024-10-08 15:13:59 +08:00
2 changed files with 46 additions and 33 deletions

View File

@@ -646,8 +646,7 @@ Secure Boot Best Practices
.. note:: .. note::
It may be necessary to revoke a key that isn't currently being used. It may be necessary to revoke a key that isn't currently being used. For example, if the active application is signed with key #0, but key #1 becomes compromised, you should revoke key #1 by using the above approach. The new OTA update should continue to be signed with key #0, and the API `esp_ota_revoke_secure_boot_public_key (SECURE_BOOT_PUBLIC_KEY_INDEX_[N])` can be used to revoke the key #N (N would be 1 in this case). After revoking, all remaining unrevoked keys can still be used to sign future applications.
For example, if the active application is signed with key #0, but key #1 becomes compromised, you should revoke key #1 by using the above approach. The new OTA update should continue to be signed with key #0, and the API `esp_ota_revoke_secure_boot_public_key(SECURE_BOOT_PUBLIC_KEY_INDEX_[N])` can be used to revoke the key #N (N would be 1 in this case). After revoking, all remaining unrevoked keys can still be used to sign future applications.
.. _secure-boot-v2-aggressive-key-revocation: .. _secure-boot-v2-aggressive-key-revocation:

View File

@@ -29,7 +29,7 @@
.. only:: esp32 .. only:: esp32
芯片版本低于 v3.0 的 ESP32 安全启动请参阅 :doc:`secure-boot-v1`。如果你的芯片版本支持安全启动 v2推荐使用此模式相比安全启动 v1 更安全且灵活。 芯片版本低于 v3.0 的 ESP32 安全启动请参阅 :doc:`secure-boot-v1`。如果当前芯片版本支持安全启动 v2推荐使用此模式相比安全启动 v1 更安全且灵活。
安全启动 v2 使用基于 {IDF_TARGET_SBV2_SCHEME} 的应用程序和引导加载程序 (bootloader) :ref:`second-stage-bootloader` 验证。若需要使用 {IDF_TARGET_SBV2_SCHEME} 方案对应用程序签名,且无需对 bootloader 签名,同样可以参考本文档。 安全启动 v2 使用基于 {IDF_TARGET_SBV2_SCHEME} 的应用程序和引导加载程序 (bootloader) :ref:`second-stage-bootloader` 验证。若需要使用 {IDF_TARGET_SBV2_SCHEME} 方案对应用程序签名,且无需对 bootloader 签名,同样可以参考本文档。
@@ -83,10 +83,10 @@
- 芯片在量产时最多能生成并存储三个公钥。 - 芯片在量产时最多能生成并存储三个公钥。
- {IDF_TARGET_NAME} 支持永久销个别公钥,对此可以选择保守或激进的配置。 - {IDF_TARGET_NAME} 支持永久销个别公钥,对此可以选择保守或激进的配置。
- 保守配置:在此情况下,只有在 bootloader 和应用程序成功迁移到新密钥后才会销旧密钥。 - 保守配置:在此情况下,只有在 bootloader 和应用程序成功迁移到新密钥后才会销旧密钥。
- 激进配置:在此情况下,只要使用此密钥验证失败,就会立即销该密钥。 - 激进配置:在此情况下,只要使用此密钥验证失败,就会立即销该密钥。
- 应用程序和软件 bootloader 采用相同的镜像格式和签名验证方法。 - 应用程序和软件 bootloader 采用相同的镜像格式和签名验证方法。
@@ -361,11 +361,11 @@ bootloader 大小
- BLOCK_KEYX - 该块包含其在 KEY_PURPOSE_X 中烧录的功能的对应数据,并存储公钥的 SHA-256 哈希摘要。公钥模数、指数、预先计算的 R 和 M' 值的 SHA-256 哈希摘要都将写入 eFuse 密钥块。这个摘要大小为 776 字节,偏移量从 36 到 812:ref:`signature-block-format` 所示。注意,必须设置写保护位,但切勿设置读保护位。 - BLOCK_KEYX - 该块包含其在 KEY_PURPOSE_X 中烧录的功能的对应数据,并存储公钥的 SHA-256 哈希摘要。公钥模数、指数、预先计算的 R 和 M' 值的 SHA-256 哈希摘要都将写入 eFuse 密钥块。这个摘要大小为 776 字节,偏移量从 36 到 812:ref:`signature-block-format` 所示。注意,必须设置写保护位,但切勿设置读保护位。
- KEY_REVOKEX - 与 3 个密钥块中的每一个相对应的销标记。例如,设置 KEY_REVOKE2 将销密钥功能为 SECURE_BOOT_DIGEST2 的密钥块。 - KEY_REVOKEX - 与 3 个密钥块中的每一个相对应的销标记。例如,设置 KEY_REVOKE2 将销密钥功能为 SECURE_BOOT_DIGEST2 的密钥块。
- SECURE_BOOT_AGGRESSIVE_REVOKE - 启用激进的密钥销。只要与此密钥的验证失败,密钥就会立即销。 - SECURE_BOOT_AGGRESSIVE_REVOKE - 启用激进的密钥销。只要与此密钥的验证失败,密钥就会立即销。
为确保后续不会有攻击者添加受信任的密钥,应使用 KEY_REVOKEX 销所有未使用的密钥摘要槽。若未启用 :ref:`CONFIG_SECURE_BOOT_ALLOW_UNUSED_DIGEST_SLOTS`,应用程序启动时,将在 :cpp:func:`esp_secure_boot_init_checks` 中检查和修复销操作。 为确保后续不会有攻击者添加受信任的密钥,应使用 KEY_REVOKEX 销所有未使用的密钥摘要槽。若未启用 :ref:`CONFIG_SECURE_BOOT_ALLOW_UNUSED_DIGEST_SLOTS`,应用程序启动时,将在 :cpp:func:`esp_secure_boot_init_checks` 中检查和修复销操作。
密钥必须为可读密钥,以便软件访问。如果密钥设置了读保护,软件只能读取到全为零的数据,导致签名验证失败,启动中止。 密钥必须为可读密钥,以便软件访问。如果密钥设置了读保护,软件只能读取到全为零的数据,导致签名验证失败,启动中止。
@@ -407,7 +407,7 @@ bootloader 大小
7. 运行 ``idf.py bootloader`` 构建启用了安全启动的 bootloader ,构建输出中会包含一个烧录命令的提示,使用 ``esptool.py write_flash`` 烧录。 7. 运行 ``idf.py bootloader`` 构建启用了安全启动的 bootloader ,构建输出中会包含一个烧录命令的提示,使用 ``esptool.py write_flash`` 烧录。
8. 当你准备好烧录 bootloader ,请运行指定命令并等待烧录完成。注意,此处的指定命令需要手动输入,构建系统不会执行此过程。 8. 烧录 bootloader ,请运行指定命令并等待烧录完成。注意,此处的指定命令需要手动输入,构建系统不会执行此过程。
9. 运行 ``idf.py flash`` 构建并烧录分区表以及刚刚构建的应用程序镜像,该镜像使用步骤 6 中生成的签名密钥进行签名。 9. 运行 ``idf.py flash`` 构建并烧录分区表以及刚刚构建的应用程序镜像,该镜像使用步骤 6 中生成的签名密钥进行签名。
@@ -415,7 +415,7 @@ bootloader 大小
如果启用了安全启动,``idf.py flash`` 不会烧录 bootloader。 如果启用了安全启动,``idf.py flash`` 不会烧录 bootloader。
10. 重置 {IDF_TARGET_NAME},它将启动烧录的软件 bootloader 。该软件 bootloader 会在芯片上启用安全启动,然后验证应用程序镜像签名,并启动应用程序。请查看 {IDF_TARGET_NAME} 的串行控制器输出,确保已启用安全启动,且没有因构建配置发生错误。 10. 重置 {IDF_TARGET_NAME} 将启动烧录的软件 bootloader。该软件 bootloader 会在芯片上启用安全启动,然后验证应用程序镜像签名,并启动应用程序。请查看 {IDF_TARGET_NAME} 的串行控制器输出,确保已启用安全启动,且没有因构建配置发生错误。
.. note:: .. note::
@@ -435,16 +435,16 @@ bootloader 大小
- 注意,启用安全启动或 flash 加密会禁用 ROM 中的 USB-OTG USB 栈,阻止通过该端口进行串行仿真或设备固件更新 (DFU)。 - 注意,启用安全启动或 flash 加密会禁用 ROM 中的 USB-OTG USB 栈,阻止通过该端口进行串行仿真或设备固件更新 (DFU)。
- 一旦启用安全启动,就无法再对 eFuse 密钥进行读保护,这可以避免攻击者对存储公共密钥摘要的 eFuse 块进行读保护,进而导致系统无法验证和处理签名,系统服务无法正常运行。有关读保护密钥的更多信息,请参阅下方详细说明。
烧录读保护密钥 烧录读保护密钥
~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
一旦启用安全启动,就无法再对 eFuses 进行读保护,这可以避免攻击者对存储公共密钥摘要的 eFuse 块进行读保护,进而导致系统无法验证和处理签名,系统服务无法正常运行。 **读保护密钥**
以下密钥受到读保护后,相应的硬件将直接访问这些密钥(软件无法读取):
如果第二阶段 bootloader 启用了 :doc:`/security/flash-encryption`,它会确保在第一次启动时生成的 flash 加密密钥被读保护。
如需在设备启用安全启动后对密钥进行读保护,如:
.. list:: .. list::
:SOC_FLASH_ENC_SUPPORTED:* flash 加密密钥 :SOC_FLASH_ENC_SUPPORTED:* flash 加密密钥
:SOC_HMAC_SUPPORTED:* HMAC 密钥 :SOC_HMAC_SUPPORTED:* HMAC 密钥
@@ -453,19 +453,28 @@ bootloader 大小
:SOC_KEY_MANAGER_SUPPORTED:* 密钥管理器密钥 :SOC_KEY_MANAGER_SUPPORTED:* 密钥管理器密钥
请在启用安全启动的同时启用配置项 :ref:`CONFIG_SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS`,以防止禁用 eFuses 读保护功能。 **不受读保护的密钥**
因软件访问需要(软件可读取),以下密钥不受读保护:
建议在启用安全启动之前,完成全部密钥的烧录。 .. list::
如需启用配置项 :ref:`CONFIG_SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS`,请在所有读保护 eFuses 密钥烧录后,使用 ``esp_efuse.h````esp_efuse_write_field_bit()`` API 烧录 eFuses {IDF_TARGET_EFUSE_WR_DIS_RD_DIS}。 :SOC_SECURE_BOOT_SUPPORTED:* 安全启动公共密钥摘要
* 用户数据
启用安全启动后,默认禁用 eFuses 读保护功能。如后续需在应用程序中对某个 eFuse例如上述读保护密钥列表中的密钥进行读保护请在启用安全启动的同时启用配置项 :ref:`CONFIG_SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS`
建议在启用安全启动之前,完成全部密钥的烧录。如需启用配置项 :ref:`CONFIG_SECURE_BOOT_V2_ALLOW_EFUSE_RD_DIS`,请在所有读保护 eFuse 密钥烧录后,使用 :cpp:func:`esp_efuse_write_field_bit` 烧录 eFuse {IDF_TARGET_EFUSE_WR_DIS_RD_DIS}。
.. note::
如果在启用安全启动时,第二阶段引导加载程序启用了 :doc:`/security/flash-encryption`,则首次启动时生成的 flash 加密密钥已经受到读保护。
.. _secure-boot-v2-generate-key: .. _secure-boot-v2-generate-key:
生成安全启动签名密钥 生成安全启动签名密钥
---------------------------------- ----------------------------------
构建系统提示,使用 ``idf.py secure-generate-signing-key`` 命令生成新签名密钥。 根据构建系统提示,使用 ``idf.py secure-generate-signing-key`` 命令生成新签名密钥。
.. only:: esp32 or SOC_SECURE_BOOT_V2_RSA .. only:: esp32 or SOC_SECURE_BOOT_V2_RSA
@@ -522,7 +531,7 @@ bootloader 大小
idf.py secure-sign-data BINARY_FILE --keyfile PRIVATE_SIGNING_KEY idf.py secure-sign-data BINARY_FILE --keyfile PRIVATE_SIGNING_KEY
上述命令将镜像签名附加到现有的二进制文件中,可以使用 `--output` 参数将签名后的二进制文件写入单独的文件: 上述命令将镜像签名附加到现有的二进制文件中,可以使用 `--output` 参数将签名后的二进制文件写入单独的文件:
.. code-block:: .. code-block::
@@ -532,7 +541,7 @@ bootloader 大小
使用预计算的签名进行签名 使用预计算的签名进行签名
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果你拥有为镜像生成的有效预计算签名及相应公钥,可以使用这些签名生成一个签名扇区,并将其附加到镜像中。注意,预计算的签名应计算在镜像中的所有字节,包括安全填充字节。 如果存在为镜像生成的有效预计算签名及相应公钥,可以使用这些签名生成一个签名扇区,并将其附加到镜像中。注意,预计算的签名应计算在镜像中的所有字节,包括安全填充字节。
在此情况下,应禁用选项 :ref:`CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES` 来构建固件镜像。该镜像将进行安全填充,并使用以下命令,生成带签名的二进制文件: 在此情况下,应禁用选项 :ref:`CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES` 来构建固件镜像。该镜像将进行安全填充,并使用以下命令,生成带签名的二进制文件:
@@ -546,7 +555,7 @@ bootloader 大小
使用外部硬件安全模块 (HSM) 进行签名 使用外部硬件安全模块 (HSM) 进行签名
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
为了提高安全性,可能使用外部硬件安全模块 (HSM) 存储私钥,该私钥无法直接访问,但具备一个接口,可以生成二进制文件及其相应公钥的签名。 为了提高安全性,可能需要使用外部硬件安全模块 (HSM) 存储私钥,该私钥无法直接访问,但具备一个接口,可以生成二进制文件及其相应公钥的签名。
在此情况下,请禁用选项 :ref:`CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES` 并构建固件。随后,可以将已进行安全填充的镜像提供给外部硬件安全模块来生成签名。请参阅 `使用外部 HSM 签名 <https://docs.espressif.com/projects/esptool/en/latest/{IDF_TARGET_PATH_NAME}/espsecure/index.html#remote-signing-using-an-external-hsm>`_ 生成已签名镜像。 在此情况下,请禁用选项 :ref:`CONFIG_SECURE_BOOT_BUILD_SIGNED_BINARIES` 并构建固件。随后,可以将已进行安全填充的镜像提供给外部硬件安全模块来生成签名。请参阅 `使用外部 HSM 签名 <https://docs.espressif.com/projects/esptool/en/latest/{IDF_TARGET_PATH_NAME}/espsecure/index.html#remote-signing-using-an-external-hsm>`_ 生成已签名镜像。
@@ -583,15 +592,15 @@ bootloader 大小
* 烧录 eFuse 可以由软件 bootloader 在首次从 menuconfig 启用 ``Secure Boot v2`` 后进行,也可以使用 ``espefuse.py``,后者与 ROM 中的串行 bootloader 通信。 * 烧录 eFuse 可以由软件 bootloader 在首次从 menuconfig 启用 ``Secure Boot v2`` 后进行,也可以使用 ``espefuse.py``,后者与 ROM 中的串行 bootloader 通信。
* KEY_DIGEST 应从密钥摘要 #0 开始,按顺序编号。如果使用了密钥摘要 #1则必须使用密钥摘要 #0。如果使用了密钥摘要 #2则必须使用密钥摘要 #0 和 #1。 * KEY_DIGEST 应从密钥摘要 #0 开始,按顺序编号。如果使用了密钥摘要 #1则必须使用密钥摘要 #0。如果使用了密钥摘要 #2则必须使用密钥摘要 #0 和 #1。
* 软件 bootloader 不支持 OTA 升级,它将至少由一个私钥签名,也可能使用全部三个私钥,并在工厂内烧录。 * 软件 bootloader 不支持 OTA 升级,它将至少由一个私钥签名,也可能使用全部三个私钥,并在工厂内烧录。
* 应用程序应仅由单个私钥签名,其他私钥应妥善保管。但如果需要销某些私钥,也可以使用多个签名私钥,请参阅下文的 :ref:`secure-boot-v2-key-revocation` * 应用程序应仅由单个私钥签名,其他私钥应妥善保管。但如果需要销某些私钥,也可以使用多个签名私钥,请参阅下文的 :ref:`secure-boot-v2-key-revocation`
多个密钥管理 多个密钥管理
------------- -------------
* 在烧录 bootloader 之前,应使用设备整个生命周期所需的所有私钥对 bootloader 签名。 * 在烧录 bootloader 之前,应使用设备整个生命周期所需的所有私钥对 bootloader 签名。
* 构建系统每次只能使用一个私钥签名,如果需要,必须手动运行命令以附加更多签名。 * 构建系统每次只能使用一个私钥签名,如果需要,必须手动运行命令以附加更多签名。
* 可以使用 ``idf.py secure-sign-data`` 的附加功能,此命令也将在启用安全启动 v2 的 bootloader 编译的末尾显示。 * 可以使用 ``idf.py secure-sign-data`` 的附加功能,此命令也将在启用安全启动 v2 的 bootloader 编译的末尾显示。
.. code-block:: .. code-block::
@@ -606,10 +615,11 @@ bootloader 大小
.. _secure-boot-v2-key-revocation: .. _secure-boot-v2-key-revocation:
销密钥管理 销密钥管理
-------------- --------------
* 密钥按线性顺序处理,即密钥 #0、密钥 #1、密钥 #2。 * 密钥按线性顺序处理,即密钥 #0、密钥 #1、密钥 #2。
* 撤销一个密钥后,其余未被撤销的密钥仍可用于应用程序签名。例如,如密钥 #1 被撤销,仍然可以使用密钥 #0 和密钥 #2 给应用程序签名。
* 应用程序每次应只使用一个密钥签名,尽量避免暴露未使用的私钥。 * 应用程序每次应只使用一个密钥签名,尽量避免暴露未使用的私钥。
* bootloader 可以使用来自工厂的多个函数签名。 * bootloader 可以使用来自工厂的多个函数签名。
@@ -629,24 +639,28 @@ bootloader 大小
3. 验证新应用程序的签名块。对比公钥与 eFuse 中烧录的摘要,并使用已验证的公钥验证应用程序。 3. 验证新应用程序的签名块。对比公钥与 eFuse 中烧录的摘要,并使用已验证的公钥验证应用程序。
4. 将活动分区设置为新的 OTA 应用程序分区。 4. 将活动分区设置为新的 OTA 应用程序分区。
5. 设备重置并加载使用密钥 #N-1 验证的 bootloader ,随后启动使用密钥 #N 验证的新应用程序。 5. 设备重置并加载使用密钥 #N-1 验证的 bootloader ,随后启动使用密钥 #N 验证的新应用程序。
6. 新应用程序使用密钥 #N 验证 bootloader ,这是最后的检查,然后运行代码销密钥 #N-1即设置 KEY_REVOKE eFuse 位。 6. 新应用程序使用密钥 #N 验证 bootloader ,这是最后的检查,然后运行代码销密钥 #N-1即设置 KEY_REVOKE eFuse 位。
7. 可以使用 API `esp_ota_revoke_secure_boot_public_key()`销密钥 #N-1。 7. 可以使用 API :cpp:func:`esp_ota_revoke_secure_boot_public_key`销密钥 #N-1。
* 类似的方法也可以用于物理重新烧录,以使用新的密钥,还可以同时更改 bootloader 的内容。 * 类似的方法也可以用于物理重新烧录,以使用新的密钥,还可以同时更改 bootloader 的内容。
.. note::
当前未使用的密钥可以被撤销。例如,如果活动应用程序由密钥 #0 签名,但密钥 #1 已被泄露,请通过上述方法撤销密钥 #1。新的 OTA 更新应继续使用密钥 #0 签名,并且可以使用 API `esp_ota_revoke_secure_boot_public_key (SECURE_BOOT_PUBLIC_KEY_INDEX_[N])` 来撤销密钥 #N在此例中N 为 1。撤销该密钥后其余密钥以后仍可用于给应用程序签名。
.. _secure-boot-v2-aggressive-key-revocation: .. _secure-boot-v2-aggressive-key-revocation:
激进方法 激进方法
~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
ROM 代码具备一项额外功能,即在签名验证失败时可以销公钥摘要。 ROM 代码具备一项额外功能,即在签名验证失败时可以销公钥摘要。
请烧录 ``SECURE_BOOT_AGGRESSIVE_REVOKE`` eFuse 或启用 :ref:`CONFIG_SECURE_BOOT_ENABLE_AGGRESSIVE_KEY_REVOKE` 以启用此功能。 请烧录 ``SECURE_BOOT_AGGRESSIVE_REVOKE`` eFuse 或启用 :ref:`CONFIG_SECURE_BOOT_ENABLE_AGGRESSIVE_KEY_REVOKE` 以启用此功能。
销密钥仅适用于成功启用了安全启动的情况。此外,在签名块无效或镜像摘要无效的情况下不会销密钥,仅在签名验证失败时,即在 :ref:`verify_image` 的第 3 步中验证失败时,才会执行销操作。 销密钥仅适用于成功启用了安全启动的情况。此外,在签名块无效或镜像摘要无效的情况下不会销密钥,仅在签名验证失败时,即在 :ref:`verify_image` 的第 3 步中验证失败时,才会执行销操作。
一旦销了密钥,它将无法再用于验证镜像签名。该功能提供了强大的物理攻击防护,但如果由于签名验证失败而销了所有密钥,可能会导致设备再也无法使用。 一旦销了密钥,它将无法再用于验证镜像签名。该功能提供了强大的物理攻击防护,但如果由于签名验证失败而销了所有密钥,可能会导致设备再也无法使用。
.. _secure-boot-v2-technical-details: .. _secure-boot-v2-technical-details: