12.2. 了解 UEFI 安全启动密钥层次结构
引导映像的密码密封依赖于 UEFI Secure Boot 来验证引导工件的完整性。Secure Boot 使用三种密钥类型的层次结构来建立信任链。
- 平台密钥(PK)
- PK 充当安全引导信任层次结构的根。每个系统都恰好包含一个PK,用于控制对安全启动密钥数据库的访问,并签署对KEK数据库的更新。注册PK会将固件从设置模式转换到用户模式,从而实现安全启动实施。
- 密钥交换密钥(KEK)
-
系统可以注册一个或多个 KEK。KEK授权更新签名数据库(
db)。此密钥启用委派:PK 所有者授权其他方管理受信任的签名密钥,而不会放弃对安全启动配置的完全控制。 - 签名数据库(
数据库) db包含固件用于验证引导二进制文件的密钥或哈希。当固件加载引导加载程序或统一内核映像(UKI)时,它会对照数据库中的密钥检查二进制文件的签名。如果签名与数据库条目匹配,二进制文件将执行。注意如果您的基础架构已经使用已设置的安全启动密钥,请跳过生成新密钥。您只需要访问
数据库密钥,或者能够将签名密钥添加到现有数据库中,即可对 UKI 进行签名。
12.2.1. 生成用于图像密封的安全启动密钥 复制链接链接已复制到粘贴板!
要签名并验证密封的引导映像,请生成一整套 UEFI 安全引导密钥。此过程创建平台密钥 (PK)、密钥交换密钥 (KEK) 和签名数据库 (db) 密钥。
先决条件
-
openssl软件包已安装。 -
RHEL 上的
util-linux软件包中的uuidgen命令可用于生成 UUID。 - 可以使用安全位置存储私钥文件。
对于生产部署,请使用硬件安全模块 (HSM) 或专用密钥管理系统,而不是在文件系统上存储私钥。本程序中的示例直接使用 openssl 来简化。
流程
生成全局唯一标识符 (GUID) 以标识密钥所有者:
$ uuidgen --random > <GUID.txt>生成平台密钥(PK):
$ openssl req -newkey rsa:2048 -nodes -keyout PK.key -new -x509 -sha256 -days 3650 -subj '/CN=<My Platform Key>/' -out PK.crt将 GUID 转换为固件注册的 DER 编码证书:
$ openssl x509 -outform DER -in PK.crt -out PK.cer该命令生成用于签名的私钥(
PK.key)、用于签名操作的PEM证书(PK.crt)和用于固件注册的DER编码证书(PK.cer)。您必须使用适当的访问控制来保护私钥文件。生成密钥交换密钥(KEK):
$ openssl req -newkey rsa:2048 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj '/CN=<My Key Exchange Key>/' -out KEK.crt将 KEK 转换为固件注册的 DER 编码证书:
$ openssl x509 -outform DER -in KEK.crt -out KEK.cer生成签名数据库(数据库)密钥:
$ openssl req -newkey rsa:2048 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj '/CN=<MySignature Database Key>/' -out db.crt将其转换为固件注册的 DER 编码证书:
$ openssl x509 -outform DER -in db.crt -out db.cer
验证
验证系统是否成功生成了所有密钥和文本文件:
$ ls -1 PK.key PK.crt PK.cer KEK.key KEK.crt KEK.cer db.key db.crt db.cer <GUID.txt>