uefi 安装启动

十一月 28, 2025 #uefi #secure boot

Secure Boot 的签名链(PK/KEK/DB) 中的各自的作用?

结合完整的 Secure Boot 启动链(shim → grub → kernel) 进行详细的解释

信任链的根源 (OEM/固件)

UEFI 固件内部存有四类关键数据库:

名称类型主要作用由谁管理
PK(Platform Key)公开证书 + 私钥在厂商手上管理平台最顶层权限(用来更新 KEK)OEM(华硕、联想等)
KEK(Key Exchange Key)公开证书用来更新 DB / DBXOEM、Microsoft
DB(Allowed Signatures)允许列表证书 + Hash允许启动的 EFI 程序的签名Microsoft(多数 PC),OEM,用户
DBX(Forbidden Signatures)禁止列表证书 + Hash被吊销/恶意的 EFI 程序摘要Microsoft

Secure Boot 的工作原则:UEFI 只允许 DB 中签名的文件启动,禁止 DBX 中的文件。

  1. UEFI 会从 DB/DBX 中取证书来验证 shim 的签名
  2. shim.efi 验证 grubx64.efi(第二级验证)
    • shim 内置了一个 shim-own certificate (MOK)
      • → 是从 Linux 发行版(或用户)生成的
      • → 不需要微软参与
    • 所以 shim 的验证过程:
      • shim 内的 MOK 列表(Machine Owner Keys) ↓ 验证 grub 是否被 MOK 签名 grub 才能启动
    • shim 的最大用途:让 Linux 自己管理信任链,而不依赖微软。
    • 用户也可以加入自己的 MOK(mokutil --import)这样用户可以签:
      • grub
      • kernel
      • initrd
      • 甚至自己写的 EFI 程序
  3. grubx64.efi 验证 Linux kernel(第三级验证)
    • 使用 shim 提供的验证接口(shim_lock)
      • ↓ 验证 kernel 是否被 MOK(DB)签名
      • kernel 才能加载
  4. 通常:
    • 在 Ubuntu / Debian,kernel 已经用 Canonical 的私钥签名(内置在 shim MOK 内)
    • 在 Fedora,kernel 用 Red Hat 的私钥签名
    • 所以 grub加载内核时会调用 shim 的验证函数:
    • verify_pe_signature()
    • 决定内核是否可信。

微软的角色:商业公司的“代理签名”

自己签名 Secure Boot 的实际流程(完整步骤)

下面是 Linux 下常见的方式(OpenSSL + sbsigntools):

① 生成三套密钥(PK/KEK/DB)

openssl req -new -x509 -newkey rsa:2048 -sha256 -keyout PK.key -out PK.crt -subj "/CN=Custom PK/" -days 3650
openssl req -new -x509 -newkey rsa:2048 -sha256 -keyout KEK.key -out KEK.crt -subj "/CN=Custom KEK/" -days 3650
openssl req -new -x509 -newkey rsa:2048 -sha256 -keyout DB.key -out DB.crt -subj "/CN=Custom DB/" -days 3650

② 生成 UEFI 可识别的 .auth 文件

cert-to-efi-sig-list -g "$(uuidgen)" PK.crt PK.esl
sign-efi-sig-list -k PK.key -c PK.crt PK PK.esl PK.auth

KEK/DB 同理。

③ 进入 BIOS,切换到 Custom Secure Boot

大多数设备 BIOS 中选择:
Secure Boot → Custom Mode
然后可以导入你的 PK.auth, KEK.auth, DB.auth

④ 使用你的 DB 私钥签名引导程序

例如对 GRUB2 EFI 文件签名:
sbsign --key DB.key --cert DB.crt --output grubx64.efi grubx64.efi
然后用这个签名过的 grubx64.efi 启动即可。