2. 密钥与证书体系:PK、KEK、db、dbx 的作用与关系
安全启动这套体系,说白了就是一台「谁说了算」的信任机器。你想想看,电脑从按下电源键到加载操作系统,中间要经过那么多固件、驱动、引导程序——怎么保证它们都是原厂出品、没被篡改过?
答案就在这四类密钥/证书里:PK(平台密钥)、KEK(密钥交换密钥)、db(签名数据库)、dbx(撤销签名数据库)。我刚开始接触 UEFI 安全启动时,也被这些缩写搞得头大。后来亲手配过几台设备,踩过坑,才真正理解它们的关系。
嗯,咱们一个一个来拆解。
2.1 PK(Platform Key)—— 整个信任链的根
PK 是安全启动的「最高权限」。它由平台制造商(比如主板厂商)在出厂时写入,通常存储在 SPI Flash 的 UEFI 变量里。PK 的作用很简单:谁持有 PK 的私钥,谁就能修改 KEK。
我个人习惯把 PK 比作「公司的公章」。只有拿着公章的人,才能签发新的部门经理任命书(KEK)。
关键点:
- PK 只能有一个(或者一对,一个当前 PK,一个新 PK 用于更新)。
- PK 的私钥必须严格保护——泄露了,整个信任链就崩塌了。
- 我在项目中遇到过一台设备,PK 被意外清空,结果安全启动直接进入「设置模式」,任何未签名的代码都能跑。那叫一个惨。
2.2 KEK(Key Exchange Key)—— 密钥交换的「中间人」
KEK 是第二层。它用来签名对 db 和 dbx 的更新操作。说白了,PK 授权 KEK 去管理「哪些签名可以信任」和「哪些签名应该拉黑」。
你可以把 KEK 理解为「部门经理」。公章(PK)授权部门经理去更新员工名单(db/dbx),但部门经理不能自己给自己升职——修改 KEK 本身还需要 PK 签名。
实际系统中,KEK 通常包含两个证书:
- 平台厂商自己的 KEK
- Microsoft 的 KEK(用于签名 Windows 引导加载程序)
我记得有一次排查一台 Linux 双系统设备,安全启动死活过不去。最后发现是 KEK 列表里缺少 Microsoft 的证书,Windows 引导程序被拒了。加上去就好了。
2.3 db(Signature Database)—— 白名单
db 是「允许执行」的签名数据库。里面存的是受信任的证书哈希、或者直接是证书本身。UEFI 固件在加载任何 EFI 程序(引导加载程序、驱动、Option ROM)之前,都会拿它的签名去 db 里比对。
匹配上了,放行。匹配不上,拒绝。
实战经验:
我曾经帮客户调试一台工控机,每次更新固件后安全启动就报错。查了半天,发现是新的 Option ROM 签名不在 db 里。解决方案很简单:用 KEK 签名的工具把新证书加进 db 就行。但很多人不知道这个流程,直接关掉安全启动——嗯,这其实是个坏习惯。
2.4 dbx(Revoked Signature Database)—— 黑名单
dbx 和 db 正好相反。它存的是「已被撤销」的签名。如果一个证书或哈希出现在 dbx 里,即使它在 db 里也存在,固件也会拒绝加载。
为什么需要 dbx?因为证书会泄露、算法会变弱、引导程序会有漏洞。比如 2016 年发现的 SHIM 漏洞,Microsoft 就通过 Windows Update 更新了 dbx,把有问题的版本拉黑。
注意:
dbx 的更新是单向的——你只能往里面加条目,不能删除。我见过有人想「清理」dbx 来恢复某个被撤销的引导程序,结果发现根本做不到。这是设计使然:一旦撤销,永久生效。
2.5 四者的关系:一张图说清楚
光说概念可能有点抽象。我画了一张图,把 PK、KEK、db、dbx 的层级关系和验证流程串起来。你看完应该就明白了。
2.6 实际故障排查中的常见问题
搞清楚了这四个角色的关系,排查安全启动故障就有方向了。我整理了一个表格,列出我遇到过的典型问题,以及对应的排查思路。
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 安全启动开启后无法启动任何系统 | PK 存在,但 db 为空或缺少必要证书 | 检查 db 列表,确认是否包含 OS 引导程序的签名证书 |
| 更新固件后安全启动报错 | 新固件中的 Option ROM 签名不在 db 中 | 使用 KEK 签名的工具将新证书加入 db |
| Windows 更新后无法启动 | dbx 更新拉黑了旧版引导程序 | 确认引导程序版本是否被撤销,必要时更新引导程序 |
| 安全启动处于「设置模式」 | PK 被清空或未设置 | 重新安装 PK(需要平台厂商工具或 UEFI 菜单) |
| 双系统切换时一个能启动一个不能 | KEK 列表缺少对应 OS 的证书 | 将 OS 引导程序的签名证书加入 KEK 或 db |
我的一个小习惯:
每次排查安全启动问题,我第一件事就是进 UEFI 菜单,查看 PK、KEK、db、dbx 的状态。很多主板厂商提供了「恢复出厂设置」选项,但我不建议一上来就用——它会清空所有自定义配置。先拍照记录当前状态,再动手。
2.7 一句话总结
PK 是根,KEK 是桥,db 是门,dbx 是锁。四者缺一不可,顺序也不能乱。你只要记住:信任从 PK 开始,授权经过 KEK,执行看 db,撤销靠 dbx。下次遇到安全启动报错,按这个链条一层层查,基本不会跑偏。