创建三个密钥对
UEFI 安全启动基于在信任链中使用的以下三个密钥数据库:平台密钥(PK)、密钥交换密钥(KEK)和签名数据库(db)。¹
在实例上创建每个密钥。要以对 UEFI 安全启动标准有效的格式准备公钥,请为每个密钥创建一个证书。DER
定义 SSL 格式(格式的二进制编码)。然后,您将每个证书转换为 UEFI 签名列表,这是 UEFI 安全启动所理解的二进制格式。最后,使用相关密钥签署每个证书。
准备创建密钥对
在创建密钥对之前,请创建用于密钥生成的全局唯一标识符(GUID)。
-
在 Shell 提示符中运行以下命令。
uuidgen --random > GUID.txt
密钥对 1:创建平台密钥(PK)
PK 是 UEFI 安全启动实例的信任根。私有 PK 用于更新 KEK,这反过来又可以用来将授权密钥添加到签名数据库(db)。
X.509 标准用于创建密钥对。有关标准的信息,请参阅 Wikipedia 上的 X.509
要创建 PK
-
创建密钥。您必须将变量命名为
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=
– 密钥的公用名(CN)。您可以输入您自己企业的名称而不是Platform key
平台密钥
。
-
-
创建证书。
openssl x509 -outform DER -in PK.crt -out PK.cer
-
将证书转换为 UEFI 签名列表。
cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
-
使用私有 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
-
创建密钥。
openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj "/CN=Key Exchange Key/" -out KEK.crt
-
创建证书。
openssl x509 -outform DER -in KEK.crt -out KEK.cer
-
将证书转换为 UEFI 签名列表。
cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
-
使用私有 PK 签署签名列表。
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth
密钥对 3:创建签名数据库(db)
db 列表包含授权在系统上启动的授权密钥。要修改列表,需要私有 KEK。启动映像将使用此步骤中创建的私有密钥签名。
要创建 db
-
创建密钥。
openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=Signature Database key/" -out db.crt
-
创建证书。
openssl x509 -outform DER -in db.crt -out db.cer
-
将证书转换为 UEFI 签名列表。
cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
-
用私有 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、创建数据库和签署映像的命令来自创建密钥