创建三个密钥对 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

创建三个密钥对

UEFI 安全启动基于在信任链中使用的以下三个密钥数据库:平台密钥(PK)、密钥交换密钥(KEK)和签名数据库(db)。¹

在实例上创建每个密钥。要以对 UEFI 安全启动标准有效的格式准备公钥,请为每个密钥创建一个证书。DER 定义 SSL 格式(格式的二进制编码)。然后,您将每个证书转换为 UEFI 签名列表,这是 UEFI 安全启动所理解的二进制格式。最后,使用相关密钥签署每个证书。

准备创建密钥对

在创建密钥对之前,请创建用于密钥生成的全局唯一标识符(GUID)。

  1. 连接到实例。

  2. 在 Shell 提示符中运行以下命令。

    uuidgen --random > GUID.txt

密钥对 1:创建平台密钥(PK)

PK 是 UEFI 安全启动实例的信任根。私有 PK 用于更新 KEK,这反过来又可以用来将授权密钥添加到签名数据库(db)。

X.509 标准用于创建密钥对。有关标准的信息,请参阅 Wikipedia 上的 X.509

要创建 PK
  1. 创建密钥。您必须将变量命名为 PK

    openssl req -newkey rsa:4096 -nodes -keyout PK.key -new -x509 -sha256 -days 3650 -subj "/CN=Platform key/" -out PK.crt

    指定了以下参数:

    • -keyout PK.key – 私有密钥文件。

    • -days 3650 – 证书的有效天数。

    • -out PK.crt – 用于创建 UEFI 变量的证书。

    • CN=Platform key – 密钥的公用名(CN)。您可以输入您自己企业的名称而不是平台密钥

  2. 创建证书。

    openssl x509 -outform DER -in PK.crt -out PK.cer
  3. 将证书转换为 UEFI 签名列表。

    cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
  4. 使用私有 PK(自签名)签署 UEFI 签名列表。

    sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt PK PK.esl PK.auth

密钥对 2:创建密钥交换密钥(KEK)

私有 KEK 用于向 db 添加密钥,该数据库是要在系统上启动的授权签名列表。

要创建 KEK
  1. 创建密钥。

    openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj "/CN=Key Exchange Key/" -out KEK.crt
  2. 创建证书。

    openssl x509 -outform DER -in KEK.crt -out KEK.cer
  3. 将证书转换为 UEFI 签名列表。

    cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
  4. 使用私有 PK 签署签名列表。

    sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth

密钥对 3:创建签名数据库(db)

db 列表包含授权在系统上启动的授权密钥。要修改列表,需要私有 KEK。启动映像将使用此步骤中创建的私有密钥签名。

要创建 db
  1. 创建密钥。

    openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=Signature Database key/" -out db.crt
  2. 创建证书。

    openssl x509 -outform DER -in db.crt -out db.cer
  3. 将证书转换为 UEFI 签名列表。

    cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
  4. 用私有 KEK 签署签名列表。

    sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db db.esl db.auth

用私有密钥签署启动映像(内核)

对于 Ubuntu 22.04,以下映像需要签名。

/boot/efi/EFI/ubuntu/shimx64.efi /boot/efi/EFI/ubuntu/mmx64.efi /boot/efi/EFI/ubuntu/grubx64.efi /boot/vmlinuz
要签署映像

使用以下语法签署映像。

sbsign --key db.key --cert db.crt --output /boot/vmlinuz /boot/vmlinuz
注意

您必须签署所有新内核。/boot/vmlinuz 通常会将符号链接到上次安装的内核。

请参阅您的发行版的文档以了解启动链和所需映像。

¹ 感谢 ArchWiki 社区所做的所有工作。创建 PK、创建 KEK、创建数据库和签署映像的命令来自创建密钥,由 ArchWiki 维护团队和/或 ArchWiki 贡献者撰写。