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

Source: [https://docs.qualcomm.com/doc/80-70015-11SC/topic/sign-images-and-copy-auth-key-signed-files-to-efi-partition.html](https://docs.qualcomm.com/doc/80-70015-11SC/topic/sign-images-and-copy-auth-key-signed-files-to-efi-partition.html)

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

该过程提供了对以下项目的说明：
- 对各种镜像进行签名。
- 将 `(.auth)` 密钥和签名文件复制到 EFI 分区目录。

- 将签名和可执行镜像（如 `bootaa64.efi` 文件 (systemd-boot)）放到 /EFI/BOOT/ 目录中，将 `uki.efi` 文件 (Linux) 镜像放到 `/EFI/Linux/` 中。

除了验证已签名镜像外，systemd-boot还用于注册密钥。
- UEFI 安全启动密钥放在 /keys 内的特定目录中用于密钥注册。systemd-boot 使用这些密钥，并在 UEFI 启动服务期间将其部署到 RPMB 或 UEFI 变量存储中。

- 可以在 systemd-boot 加载程序配置中配置等待时间（以秒为单位）。内核加载在等待期间会延迟，因此您可以在 systemd-boot 菜单中查看并选择可用选项。

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

| EFI 系统分区 (efi.bin) | EFI 系统分区 (efi.bin) | EFI 系统分区 (efi.bin) |
| --- | --- | --- |
| /EFI | /Loader | /dtb |
| /Boot - bootaa64.efi | loader.conf | <ul class="ul" id="sign_images_and_copy_auth_key_signed_files_to_efi_partition__ul_rvs_gcr_pbc"><br>                                    <li class="li">芯片组 DTB 文件。</li><br><br>                                    <li class="li">每个 DTB 文件的签名文件。</li><br><br>                                </ul> |
| /Linux - uki.efi | /keys<br>-/authkeys<br><br><br>PK.auth<br><br><br>KEK.auth<br><br><br>db.auth | <ul class="ul" id="sign_images_and_copy_auth_key_signed_files_to_efi_partition__ul_rvs_gcr_pbc"><br>                                    <li class="li">芯片组 DTB 文件。</li><br><br>                                    <li class="li">每个 DTB 文件的签名文件。</li><br><br>                                </ul> |
|  |  |  |

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

1. 在 `contents.xml` 文件中找到 `efi.bin` 文件路径，以从 meta 获取 `efi.bin` 文件。
2. 将 `efi.bin` 文件挂载到 `<workspace>` 目录中，并在 `<workspace>` 目录中创建 `efimountedbin` 目录。
3. 挂载 `efi.bin` 文件：

        sudo mount efi.bin efimountedbinCopy to clipboard

        cd efimountedbinCopy to clipboard
4. 在 &lt;workspace&gt;/efimountedbin/loader/keys 目录中创建 authkeys 目录以注册密钥。
5. 选择 `.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
6. 使用密钥签名 `bootaa64.efi、uki.efi 和 dtb` 镜像文件，并复制到 efimountedbin目录中的相应目录。
    1. 签名 `efi` 镜像：
        sbsign 工具用于对遵循 EFI 规范的 EFI 启动镜像（如 `bootaa64.efior UKI.efi`）进行签名。此工具用于 UEFI 安全启动签名，可在 Linux 系统上下载并使用。需要注意的是，sbsign 只能对扩展名为 `.efi` 的 PE 镜像进行签名。

1. 将 efimountedbin 目录 /EFI/BOOT 中的 `bootaa64.efi` 文件和 /EFI/Linux 目录中的 `uki.efi` 文件复制到您的 Linux 计算机上的 images 目录中。
        2. 对镜像进行签名：

                cd <workspace>/imagesCopy to clipboard

                sudo sbsign --key <workspace>/keys/db.key --cert <workspace>/keys/db.crt bootaa64.efi --output <workspace>/bootaa64.efiCopy to clipboard

                sudo sbsign --key <workspace>/keys/db.key --cert <workspace>/keys/db.crt uki.efi --output <workspace>/uki.efiCopy 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 DERCopy to clipboard
        2. 要对镜像进行签名，运行以下命令：

                cd <workspace>/imagesCopy to clipboard

                sudo openssl cms -sign -inkey <workspace>/keys/db.key -signer <workspace>/keys/db.crt -binary -in qcm6490-idp.dtb --out qcm6490-idp.sig -outform DERCopy to clipboard
7. 将已签名的 `uki` 和 `bootaa64` 镜像复制回 efimountedbin 目录中的相应目录（/EFI/BOOT 和 /EFI/Linux）中。
8. 将签名的 `qcm6490-idp.sig` 文件复制到 efimountedbin 文件夹的 /dtb 目录中。
9. 在 systemd-boot中配置等待时间：
    1. 使用 sudo 访问权限打开位于 /loader/loader.conf 的 `loader.conf` 文件并进行编辑：

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

        sudo umount efimountedbinCopy to clipboard
11. 将已签名镜像和密钥安全地放置在目标上的 EFI 分区中。
让设备进入 Fastboot 模式，并使用 fastboot 命令刷写最新的 `efi.bin` 文件：

        fastboot flash efi <efi binary location>Copy to clipboard

**Parent Topic:** [启用 UEFI 安全启动](https://docs.qualcomm.com/doc/80-70015-11SC/topic/enable-uefi-secure-boot.html)

Last Published: Dec 03, 2024

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