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

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

EFI 系统分区由 EFI、loader 和 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` 文件路径，以从软件包中获取 `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 and 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 and /EFI/Linux)。
8. 将已签名的 `qcm6490-idp.sig` 文件复制到目录的 /dtb 中的文件夹 efimountedbin。
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-70014-11Y/topic/enable-uefi-secure-boot.html)

Last Published: Aug 27, 2024

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