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

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

EFI 系统分区包含启动系统和管理更新的基本文件，而 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 在 runtime 使用这些文件，并初始化设备树文件。签名时，将创建 `.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` |

## 将签名的镜像和密钥放在 EFI 分区中

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

1. 在 `contents.xml` 文件中找到 `efi.bin` 和 `dtb.bin` 文件路径，以从元获取 `efi.bin` 和 <cite>dtb.bin`</cite> 文件。
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 <selected algo PK/KEK/DB auth files from the files location> <workspace>/dtbmountedbin/loader/keys/authkeys/
        Copy to clipboard
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 < .key file > -signer < .crt file > -binary -in <input dtb file>–out < Output .dtb.sig file > -outform DER
>                 Copy to clipboard
        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)。

## 后续步骤

- 要确保通过 systemd-boot 菜单正确应用和维护安全启动设置，请参阅[从 systemd-boot 菜单启用 UEFI 安全启动](https://docs.qualcomm.com/doc/80-70018-11SC/topic/enable-uefi-secure-boot-from-systemd-boot-menu.html#enable-uefi-secure-boot-from-systemd-boot-menu)。
- 如果没有添加或修改新密钥或证书，并且现有镜像不需要 UEFI 安全启动身份验证，则请参阅[对未签名的镜像进行哈希处理并更新 dB 以进行镜像身份验证](https://docs.qualcomm.com/doc/80-70018-11SC/topic/hash-unsigned-images-and-update-db-for-image-authentication.html#hash-unsigned-images-and-update-db-for-image-authentication)。

Last Published: Apr 29, 2025

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