# 对镜像进行签名并将 (.auth) 密钥/签名文件复制到 EFI 分区

EFI 系统分区由 EFI、loader 和 ostree 组成，其中包含使用 systemd-boot 时与 EFI 相关的信息。DTB 分区由 dtb 目录组成。

该过程提供了对以下项目的说明：

- 对各种镜像进行签名
- 将 `(.auth)` 密钥和签名文件复制到 EFI 分区和 DTB 分区目录。
- 将签名和可执行镜像（例如 `bootaa64.efi` 文件 (systemd-boot)）放置在 `efimountedbin/EFI/BOOT/` 目录中，将 `vmlinuz.x.x.xx` 文件 (Linux) 镜像放置在 `efimountedbin/ostree/poky-xxx/vmlinuz-x.x.xx` 目录中。

除了验证已签名镜像外，systemd-boot 还用于注册密钥。

- UEFI 安全启动密钥放置在 `/keys` 中的特定目录中以进行密钥注册。systemd-boot 使用这些密钥，并在 UEFI 引导服务期间把它们预配到 RPMB 或 UEFI 变量存储中。
- 您可以在 systemd-boot 加载程序配置中配置等待时间（以秒为单位）。内核加载在等待期间会延迟，因此您可以在 systemd-boot 菜单中查看和选择可用选项。

设备树文件存储在 `dtbmountedbin/dtb` 目录中。UEFI 在运行时使用这些文件，并初始化设备树文件。签名时，将创建 `.sig` 个文件并将其放置在同一目录中，因为这些文件是非 PE 映像。
.. container:: nohighlight

> 
> 
> 表：EFI 系统分区（efi.bin）
> 
> 
> | `/EFI` | `/Loader` | `/ostree` |
> | --- | --- | --- |
> | `/Boot/bootaa64.efi` | `loader.conf` | `poky-xxx/vmlinuz-x.x.xx` |
> |  | `/keys/authkeys/db.auth`<br><br><br>`/keys/authkeys/KEK.auth`<br><br><br>`/keys/authkeys/PK.auth` |  |
> 
> 
> 
> 
> 表：DTB 分区 (dtb.bin)
> 
> 
> | `combined-dtb.dtb` | `combined-dtb.sig` | `/loader` |
> | --- | --- | --- |
> |  |  | `/keys/authkeys/db.auth`<br><br><br>`/keys/authkeys/KEK.auth`<br><br><br>`/keys/authkeys/PK.auth` |

按照以下步骤将已签名镜像和密钥放在 Linux 主机上的 EFI 分区中：

1. 在 `contents.xml` 文件中找到 `efi.bin` 和 `dtb.bin` 文件路径，以从元获取 `efi.bin` 和 [``](https://docs.qualcomm.com/doc/80-70017-11SC/topic/sign-images-and-copy-auth-key-signed-files-to-efi-partition.html#id1)dtb.bin [``](https://docs.qualcomm.com/doc/80-70017-11SC/topic/sign-images-and-copy-auth-key-signed-files-to-efi-partition.html#id3)文件。
2. 将 `efi.bin` 文件挂载至 `<workspace>` 目录中，并在 `<workspace>` 目录中创建 `efimountedbin` 目录。
3. 将 `dtb.bin` 文件挂载至 &lt;workspace&gt; 目录中，并在 &lt;workspace&gt; 目录中创建一个 `dtbmountedbin` 目录。
4. 挂载 `efi.bin` 文件：

sudo mount efi.bin efimountedbin
        Copy to clipboard

cd efimountedbin
        Copy to clipboard
5. 挂载 `dtb.bin` 文件：

sudo mount dtb.bin dtbmountedbin
        Copy to clipboard

cd dtbmountedbin
        Copy to clipboard
6. 在 `<workspace>/efimountedbin/loader/keys` 目录中创建 authkeys 目录以注册密钥。
7. 选择 `.auth` 文件（`PK.auth`、`KEK.auth` 和 `db.auth`）并将其复制至 authkeys 目录。

sudo cp <selected algo PK/KEK/DB auth files from the files location>
        <workspace>/efimountedbin/loader/keys/authkeys/
        Copy to clipboard
8. 在 `<workspace>/dtbmountedbin/loader/keys directory` 中创建一个 `authkeys` 目录以注册密匙。
9. 选择 `.auth files` （PK.auth、KEK.auth 和 db.auth），并将其复制到 `dtbmountedbin` 中的 authkeys 目录。

> 
> 
> - ::
>     - sudo cp &lt;selected algo PK/KEK/DB auth files from the files location&gt; &lt;workspace&gt;/dtbmountedbin/loader/keys/authkeys/
10. 使用密匙对 `bootaa64.efi, uki.efi and dtb`、`vmlinuz-x.x.xx` 和 `combined-dtb.dtb` 镜像文件进行签名，并将其复制到 `efimountedbin` 目录中的相应的目录。

    1. 为 `efi` 镜像签名：

        sbsign 工具旨在对 EFI 启动镜像进行签名，例如遵循 EFI 规范的 `bootaa64.efior UKI.efi`。此工具用于 UEFI 安全启动签名，可在 Linux 系统上下载并使用。需要注意的是，sbsign 只能对扩展名为 `.efi` 的 PE 镜像进行签名。

        1. 将 `/efimountedbin` 目录 `/EFI/BOOT` 中的 `bootaa64.efi` 文件和 `/ostree/poky-xxx/vmlinuz.x.x.xx` 目录中的 `vmlinuz-x.x.xx` 文件复制至 Linux 计算机上的 `images` 目录。
        2. 在镜像上签名：

> 
> 
> cd <workspace>/images
>                 Copy to clipboard
> 
> 
> sudo sbsign --key <workspace>/keys/db.key --cert <workspace>/keys/db.crt bootaa64.efi --output <workspace>/bootaa64.efi
>                 Copy to clipboard
> 
> 
> sudo sbsign --key <workspace>/keys/db.key --cert <workspace>/keys/db.crt vmlinuz.x.x.xx --output <workspace>/vmlinuz.x.x.xx
>                 Copy to clipboard
    2. 对 `dtb` 镜像进行签名：

        已通过 UEFI 安全启动身份验证的所有镜像都是常规 API，通常采用 PE 格式。签名标头和大小追加到现有 PE 标头，签名追加到已签名文件的末尾。

        但是，当非 PE 格式的镜像需要 UEFI 安全启动身份验证时，缺少 PE 标头及魔数会导致识别镜像格式失败。因此，无法使用标准工具和路径进行镜像验证。

        目前 UEFI 安全启动验证的镜像列表中，只有 dtb 文件是非PE格式的镜像。作为 sbsign 工具的替代方案，您可以使用 `OpenSSL cms` 命令生成签名文件，用于对非 PE 格式的镜像进行签名。

        按照以下步骤对非 EFI 镜像进行签名：

        1. 要对 dtb 文件和签名文件进行签名，请运行以下命令：

> 
> 
> openssl cms -sign -inkey &lt; .key file &gt; -signer &lt; .crt file &gt; -binary -in &lt;input dtb file&gt;–out &lt; Output .dtb.sig file &gt; -outform DER
        2. 要对镜像进行签名，请运行以下命令：

> 
> 
> cd <workspace>/images
>                 Copy to clipboard
> 
> 
> sudo openssl cms -sign -inkey <workspace>/keys/db.key -signer <workspace>/keys/db.crt -binary -in combined-dtb.dtb --out combined-dtb.sig -outform DER
>                 Copy to clipboard
11. 将签名的 `combined-dtb.sig`、`vmlinuz.x.x.xx` 和 `bootaa64.efi` 镜像复制回其各自的目录 `(dtbmountedbin/, efimountedbin/ostree/poky-xxx/, and  efimountedbin/EFI/BOOT/)`。
12. 在 systemd-boot 中配置等待时间：

    1. 使用 sudo access 打开并编辑 `/loader/loader.conf` 处的 `loader.conf` 文件：

> 
> 
> sudo vi loader.conf
>             Copy to clipboard
    2. 添加行 `timeout 2` 以设置启动菜单超时并保存文件。
13. 要卸载 EFI 二进制文件以检索最新 `efi.bin` 文件，请执行以下命令：

> 
> 
> sudo umount efimountedbin
>         Copy to clipboard
14. 要卸载 DTB 二进制文件以检索最新 `dtb.bin` 文件，请执行以下命令：

> 
> 
> sudo umount dtbmountedbin
>         Copy to clipboard
15. 将已签名镜像和密钥安全地放置在目标上的 EFI 分区中。

> 
> 
> 让设备进入 Fastboot 模式，并使用 fastboot 命令刷新最新 `efi.bin` 文件：
> 
> 
> 
> > 
> > 
> > fastboot flash efi <efi binary location>
> >         
> >         fastboot flash dtb_a <dtb binary location>
> >         Copy to clipboard

如需了解更多信息，请参阅 [quic/host-signing-tool](https://github.com/quic/host-signing-tool)。

Last Published: Apr 27, 2025

[Previous Topic
生成密钥和证书](https://docs.qualcomm.com/bundle/publicresource/80-70017-11SC/topics/generate-key-and-certificate.md) [Next Topic
从 systemd-boot 菜单启用 UEFI 安全启动](https://docs.qualcomm.com/bundle/publicresource/80-70017-11SC/topics/enable-uefi-secure-boot-from-systemd-boot-menu.md)