ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

UEFI Secure Boot自定义密钥配置:从PK/KEK/db生成到签名验证全流程

UEFI Secure Boot自定义密钥配置:从PK/KEK/db生成到签名验证全流程 前阵子给一台机器换内核重启后直接卡在一个全蓝的界面屏幕上写着“Verification failed: (0x1A) Security Violation”。不用说Secure Boot把我刚编译好的内核拦在了固件门外。今天这篇UEFI Secure Boot配置文章就是要把我从密钥生成到系统验证踩过的坑一次说清楚顺便附上避坑指南给同样在跟引导链斗智斗勇的人一个能直接照着抄的方案。这篇文章不是泛泛讲概念而是一套从零开始的完整操作流程自己生成PK、KEK、db三级密钥链装进固件给GRUB、内核、模块签名再验证整个信任链到底有没有生效。适合三类人看一是自己编译内核、用DKMS装第三方驱动的Linux用户二是要在合规环境下严格管理启动信任根的系统工程师三是纯粹想搞懂Secure Boot机制、不想再被“蓝屏”支配的折腾党。1. 为什么要自己掌握Secure Boot这把钥匙1.1 Secure Boot到底在拦谁Secure Boot的设计初衷不复杂固件在加载任何EFI程序引导加载程序、驱动、Option ROM之前先校验它是否带有被信任证书签名的签名。签名合法才允许执行不合法直接拒绝。这套机制本身没毛病但关键问题在于“谁来定义合法”。默认情况下几乎所有主板预装的都是微软的密钥库。这意味着你用Ubuntu、Fedora、openSUSE这些走了微软签名流程的大发行版开机一切正常。可一旦开始碰自己编译的内核、定制GRUB、或者装必须用DKMS自编译的驱动模块开机就会在固件层被拦下来。我那次就是给网卡驱动打了个DKMS模块重启后卡在了验签阶段系统完全进不去只能先关Secure Boot再进系统排查。所以Secure Boot拦的从来不是“坏人”而是“不在白名单里的任何东西”。它是一道信任关卡不认你是否真的安全只认你口袋里有没有对应的证书。1.2 默认微软密钥和自定义密钥的区别用微软密钥的体验是“开箱即用但钥匙不在你手里”。在Windows环境下这不是问题因为微软会帮你签好所有该签的东西。但在Linux环境下自由度就变成了成本官方内核有签名没问题但你自己patch过的内核对不起没签名拒了。发行版仓库里的驱动没问题但DKMS现场编译的.ko模块没进白名单照样拒。想换一个更轻量的引导器比如systemd-boot如果它没有走微软签名流程同样会被固件拦下。自定义密钥就是把信任根拿回自己手上。你说谁可信谁就可信签不签、签什么由自己控制。代价是这套流程一旦建立所有引导链上的关键文件都得自己负责签名内核升级、GRUB升级后也要重新签麻烦是实打实的。1.3 这个方案适合哪些人如果你只是普通用户用官方内核装的是发行版仓库里的软件包这篇文章看完了解原理就够了没必要全量照做。真正需要全套折腾的是这几类人自己编译内核并且需要在开机阶段就加载自定义模块的开发者负责安全合规系统部署的工程师需要严格掌握平台信任根以及那些“不搞明白就睡不着”的极客想把整个引导链的每一环都看得清清楚楚。我自己的情况比较典型工作需要定制内核又不想每次开机都去按MOK确认干脆就把Secure Boot的密钥体系整个接管过来一劳永逸。2. 开工前的准备硬件、工具与环境2.1 检查你的固件是否支持自定义Secure Boot不是所有主板都支持自定义Secure Boot。这是出发前必须确认的第一步。先重启进BIOS设置界面找到Secure Boot或安全启动相关选项。不同品牌叫法不一样很多主板叫“Secure Boot”里面会有“Standard/Custom”或“Setup Mode”这样的子项也有部分主板把自定义模式藏得很深甚至根本不提供。如果你在固件里只看到“启用/禁用”两个选项没有自定义模式的入口那这套自签方案基本走不通。这种情况就得靠shim MOK的方案绕开即用微软签名的shim作为第一级引导再用MOK管理自己的密钥那是另一套玩法。在系统里也可以用命令确认当前状态mokutil --sb-state输出如果是SecureBoot enabled说明机器目前处于开启状态。如果固件支持Setup Mode可能有办法通过清空PK的方式把机器切过去具体操作在第5章会详细讲。2.2 主机系统与工具链准备我是在Ubuntu系环境里操作的理论上任意主流Linux发行版都行因为要用的工具基本都在官方仓库里。需要安装的工具如下# Debian/Ubuntu系 apt install efitools sbsigntool openssl # 如果要用UEFI Shell环境下导入密钥还需要KeyTool # 有些发行版把KeyTool单独打包也可以在系统里直接用efitools里的工具生成efitools提供cert-to-efi-sig-list、sign-efi-sig-list、KeyTool.efi等工具用于生成和操作EFI签名列表。sbsigntool提供sbsign、sbverify、sbvarsign用于给EFI程序签名和验签。openssl生成RSA密钥对和X.509证书。另外准备一个FAT32格式的U盘。因为KeyTool.efi需要在UEFI Shell环境下运行读取auth文件导入固件变量FAT32是最兼容的格式。2.3 动手之前先做这三件事这步很多人会跳过但我觉得必须放在前面说因为一旦密钥装进固件出了问题没有退路会非常被动。第一备份固件设置。进BIOS里把所有配置截图或拍照尤其是启动顺序、Secure Boot相关选项、CSM设置。如果后面误操作导致启动链损坏至少知道怎么恢复原来的状态。第二确认没有依赖BitLocker或类似全盘加密机制的恢复密钥。BitLocker和TPM会记录启动链的状态改完Secure Boot密钥后Windows的BitLocker很可能要求输入恢复密钥才能解锁。提前把恢复密钥导出保存好不然真的会卡死。第三准备一个可用的Linux Live USB作为救援盘。接下来的操作有一定概率折腾到系统起不来一个能进Live环境的U盘就是你最后的兜底手段。这里顺便提醒一句用fbinsttool这类工具做的那种既支持Legacy又支持UEFI启动的多功能U盘在Secure Boot机器上大概率会全军覆没后面避坑指南里会细说。3. 密钥体系拆解PK、KEK、db到底谁管谁3.1 三级信任链的角色定义Secure Boot的密钥体系分成三个层级加上一个黑名单库。很多人第一次接触被这几个缩写搞晕我用大白话拆开讲。PKPlatform Key是整个体系的最高权限。它只有一个用途验证KEK的更新请求。换句话说只有当固件收到的更新命令带有PK签名时它才允许修改KEK。这个角色相当于“所有权人”拿着房产证才能过户。KEKKey Exchange Key负责验证db和dbx的更新。固件在允许修改白名单和黑名单之前会检查更新请求是否由KEK签名。它相当于物业公司的角色持有物业的授权能换门禁系统的名单。dbSignature Database就是门禁白名单里面存的是“允许被加载和执行的证书或文件哈希”。固件每次加载EFI程序都会拿它的签名去跟db里的证书比对匹配才放行。dbxForbidden Database则是黑名单里面存的是“明确禁止加载的证书或哈希”优先级高于db。这一层层套下来逻辑就清楚了要改白名单必须有KEK要换KEK必须有PK而PK一旦写进固件以后任何对KEK和db的合法修改都必须经过PK签名的验证。3.2 用一张表说清关系角色全称作用由谁签名PKPlatform Key验证KEK更新最高权限自签名KEKKey Exchange Key验证db/dbx更新PK签名dbSignature Database白名单允许执行的证书与哈希KEK签名dbxForbidden Database黑名单禁止执行的证书与哈希KEK签名3.3 密钥文件格式esl与auth实际操作中会生成好几种文件容易搞混的是一堆后缀.key、.crt、.esl、.auth。.key是RSA私钥.crt是配套的X.509证书。.eslEFI Signature List是证书的容器格式等于把证书装进了一个固件能识别的名单文件里。.auth是带签名的变量更新文件。固件有个特性Secure Boot相关变量不是随便能写的只有当更新请求本身带有效签名时才会接受。.auth文件就是把“我要更新这个变量”的命令也签好固件收到后验证签名有效才会写入。所以流程是先生成.key和.crt再把证书打包成.esl最后对.esl签名生成.auth。固件认的是.auth文件。这里顺便提一句SSH密钥Secure Boot的这套密钥和SSH密钥完全是两码事别混在一起。SSH密钥是登录服务器用的Secure Boot密钥是给固件验签用的唯一的共同点是都叫“密钥”但性质和使用场景完全不同。4. 从零生成密钥链的完整实操4.1 生成GUID与三套密钥对先获取一个UUID作为变量的GUID标识。UEFI变量有一个命名空间PK、KEK、db的变量名是固定的PK、KEK、db但GUID是区分不同厂商和所有者的。自己生成一套密钥就必须用自己的GUIDuuidgen记录这个UUID后续所有命令都会用到。假设生成结果是3b0f0f00-8f6d-4d3a-b0a1-2f0a0b1c2d3e我后面就用这个示例值。生成PK的私钥和证书openssl req -new -x509 -newkey rsa:2048 -subj /CNMy Platform Key/ \ -keyout PK.key -out PK.crt -days 3650 -nodes生成KEK和db的私钥与证书命令同理只是CN和文件名换成各自的openssl req -new -x509 -newkey rsa:2048 -subj /CNMy Key Exchange Key/ \ -keyout KEK.key -out KEK.crt -days 3650 -nodes openssl req -new -x509 -newkey rsa:2048 -subj /CNMy Signature Database Key/ \ -keyout db.key -out db.crt -days 3650 -nodes为什么用RSA-2048而不是RSA-4096这是个很实际的问题。很多固件的Secure Boot实现基于EDK II代码库对超大密钥的解析并不总是可靠且RSA-2048是目前所有固件都明确支持的规格。既然是被固件消费的证书就得按固件的规矩来没必要为了“看起来更安全”赌兼容性。4.2 生成esl和auth文件第一步把证书转换成EFI签名列表格式GUID3b0f0f00-8f6d-4d3a-b0a1-2f0a0b1c2d3e cert-to-efi-sig-list -g $GUID PK.crt PK.esl cert-to-efi-sig-list -g $GUID KEK.crt KEK.esl cert-to-efi-sig-list -g $GUID db.crt db.esl第二步生成带签名的变量更新文件。这一步的签名关系必须严格对应# PK的auth由PK自己签名 sign-efi-sig-list -k PK.key -c PK.crt PK PK.esl PK.auth # KEK的auth由PK签名 sign-efi-sig-list -k PK.key -c PK.crt KEK KEK.esl KEK.auth # db的auth由KEK签名 sign-efi-sig-list -k KEK.key -c KEK.crt db db.esl db.auth注意命令里PK PK.esl PK.auth这一段的含义第一个PK是变量名第二个是输入的esl文件名第三个是输出的auth文件名。别搞反了。签名层级是整个Secure Boot的核心也是最容易出错的地方。KEK的auth必须由PK签名db的auth必须由KEK签名不能越级。如果拿PK的密钥签db的更新固件会在验签时直接拒绝写入。4.3 备份与权限管理生成完所有文件后第一件事不是导入固件而是备份。我把整套文件放在一个单独的目录里然后用U盘复制了一套放到离线环境保存。为什么强调离线因为私钥泄漏等于信任根被人抢走不到万不得已不要联网存放。chmod 600 PK.key KEK.key db.key chmod 644 PK.crt KEK.crt db.crt私钥文件的权限严格限定为当前用户可读写。这些文件一旦落到别人手里对方就能用你的私钥替任意EFI程序签名固件依然会信任安全体系就彻底失守了。另外把GUID记录下来也很有必要。后续如果密钥过期要重新签发证书旧证书需要进dbx作废而新证书还要用同一把私钥和原始GUID来生成才能保持身份延续。5. 把密钥装进固件Setup Mode和KeyTool实操5.1 进入Setup Mode的三种路径固件的Secure Boot有两种状态User Mode和Setup Mode。默认出厂状态下密钥库是空的处于Setup Mode这个模式允许直接写入新的PK。一旦PK被写进去固件就进入User Mode之后对KEK和db的更新都必须携带合法签名。所以导入密钥的正确顺序是先让固件处于Setup Mode然后依次导入PK、KEK、db。进入Setup Mode的办法如果是全新主板、从没设置过Secure Boot通常本来就处于Setup Mode。如果已经设置过密钥大部分主板提供“恢复出厂密钥”或“重置Secure Boot”的选项名称可能是Restore Factory Keys、Reset Secure Boot Keys或Delete All Secure Boot Keys执行后固件会清空密钥库并回到Setup Mode。部分固件允许通过UEFI Shell直接清空PK变量但有相当多主板不开放这个操作所以最稳妥的还是走固件设置界面。判断是否处于Setup Mode最直接的办法是切到系统后用命令看mokutil --sb-state显示SecureBoot enabled是User Mode显示类似Secure Boot is disabled或setup mode才是待写入状态。也有的固件在Setup Mode下SecureBoot变量会处于0状态注意区分。5.2 用KeyTool导入PK、KEK、dbKeyTool是efi工具包里提供的图形化工具在UEFI Shell下运行用来管理Secure Boot变量。我第一次用的时候全程靠猜后来发现逻辑很简单。先把KeyTool.efi和三个.auth文件都放到FAT32 U盘的根目录或某个子目录UEFI Shell能直接识别FAT32文件系统。然后从固件的启动项里选择“UEFI Shell”进入Shell环境。在Shell里运行fs0: cd \ KeyTool.efiKeyTool启动后主界面有几个操作入口。我们需要的是Edit PK、Edit KEK、Edit db这几个菜单。操作顺序必须严格从PK开始进入Edit PK选择Replace浏览到PK.auth确认导入。进入Edit KEK选择Replace导入KEK.auth。进入Edit db选择Replace导入db.auth。替换而不是追加是为了避免固件里残留微软的默认密钥。除非你后面要保留微软密钥做双系统兼容否则全部替换成自己的即可。导入完成后回到主界面会看到一个选项叫Switch to User Mode。先别急着点确认三个auth文件都导入成功再切。一旦切到User Mode后续所有修改都必须带签名再想回到Setup Mode就得清空密钥等于从头再来。5.3 切回User Mode与保留微软密钥的特殊情况如果这台机器只需要跑Linux导入自己这套密钥、切回User Mode就完成了。但如果你需要Windows双系统情况就拧巴了。Windows的引导程序由微软签名固件在启动Windows bootloader时会不会放行取决于db里是否包含微软的证书。如果你把自己的db整个替换掉微软证书被清掉Windows必然启动失败。解决方案是在替换db时不选Replace选Append把自己签发的证书追加到现有db里保留微软证书。KEK同理把微软的KEK一并留着这样以后微软更新db黑名单时固件也能验签放行。这种做法等于在自建信任根的同时兼容了微软链代价是安全纯净度下降了一些。我的方案是单Linux环境所以选了彻底替换。没有明确需求就别给自己添堵保留微软密钥更稳妥。6. 签名引导链从GRUB到内核再到模块6.1 自签方案下引导链怎么走常规发行版出于兼容性考虑用的是“shim GRUB MOK”的三段式结构shim由微软签名固件信任微软所以shim能过GRUB由shim信任的MOK证书签名所以GRUB能过内核再由GRUB或者MOK链传递信任。但当我们把db整个替换成自己的证书后其实可以绕开shim这层直接让固件信任自己的db然后由db签名的证书来签GRUB和内核。引导链简化为固件验证db→ GRUB由db.key签名→ 内核由db.key签名→ 模块由db.key签名这样做的好处是链路更短少了一层间接信任坏处是GRUB和内核每次更新后都要记得重新签名否则下次开机又是Security Violation。6.2 用sbsign给EFI程序签名签名EFI程序使用sbsign指定私钥和证书文件# 签名GRUB sbsign --key db.key --cert db.crt --output /boot/EFI/BOOT/grubx64.efi \ /boot/EFI/BOOT/grubx64.efi # 签名内核 sbsign --key db.key --cert db.crt --output /boot/vmlinuz-linux \ /boot/vmlinuz-linux注意sbsign不支持原地签名必须指定--output输出到新文件。实际操作时常用带后缀的新文件覆盖旧文件比如先输出到vmlinuz-linux.signed再替换。签完以后可以立即用sbverify验证sbverify --cert db.crt /boot/vmlinuz-linux输出Signature verification OK就说明内核已经处于db证书保护之下。其实不仅仅GRUB和内核所有在启动链上会被固件加载的EFI程序都要签systemd-boot、refind、内存测试工具、还有你日后加到EFI启动项里的任何.efi文件。这一条容易漏我自己就漏过一次装了refind后重启直接进不去原因就是忘了给它签名。6.3 内核模块签名内核模块的签名机制和EFI程序不同用的是内核自身的模块签名框架。如果你的内核是自己编译的在配置内核时启用以下选项CONFIG_MODULE_SIGy CONFIG_MODULE_SIG_ALLy CONFIG_MODULE_SIG_SHA256y然后重新编译内核编译完成后可以指定密钥对模块做最终签名。对于第三方的DKMS模块编译完成后需要手动调用内核源码树里的sign-file脚本/usr/src/kernels/$(uname -r)/scripts/sign-file \ sha256 db.key db.crt /path/to/module.ko注意签名后模块必须重新放进模块目录并更新依赖cp /path/to/module.ko /lib/modules/$(uname -r)/extra/ depmod -a签名和复制顺序别颠倒。内核加载模块时做的是验签动作你必须在模块进入模块目录之前完成签名否则depmod生成的依赖信息里记录的校验值会对应不上。6.4 内核升级后如何自动重新签名手动签名偶尔搞一下可以每次内核更新都手动弄就太折磨了。推荐写一个脚本放在内核升级后自动触发的位置。以Ubuntu系为例写一个/etc/kernel/postinst.d/zz-secureboot-sign脚本#!/bin/bash version$1 kernel_path/boot/vmlinuz-$version signed_path$kernel_path.signed if [ ! -f $kernel_path ]; then exit 0 fi sbsign --key /etc/secureboot/db.key \ --cert /etc/secureboot/db.crt \ --output $signed_path $kernel_path mv $signed_path $kernel_path脚本放到postinst.d目录后每次内核包安装或升级结束都会自动对新的vmlinuz签名一次。注意脚本要加执行权限并且/etc/secureboot目录下的私钥权限要锁好。GRUB升级同理可以在包管理器的钩子里处理也可以在GRUB更新后手动跑一次sbsign。最省事的办法是给GRUB也写个类似钩子或者在升级完系统后统一跑一个签名脚本。7. 系统验证三板斧7.1 看开关mokutil与dmesg密钥装完、签名做完系统能正常起来这只是第一步。要确认Secure Boot真的在按预期工作还得有意识地验一遍。在系统里执行mokutil --sb-state正常应输出SecureBoot enabled。如果显示SecureBoot disabled说明固件层面的Secure Boot其实没开那前边所有签名工作都是白费。再查内核启动日志dmesg | grep -i secure boot内核启动时会记录Secure Boot的状态信息如果顺利会看到类似Secure boot enabled的日志。这一步能确认内核在启动时感知到了固件的状态并进入对应的安全模式。还有一个容易被忽略的检查点Linux内核的lockdown机制。内核在检测到Secure Boot开启时会自动启用lockdown模式限制某些高危操作。查看当前lockdown状态cat /sys/kernel/security/lockdown如果输出是none [integrity]或者none [confidentiality]说明内核确实根据Secure Boot状态进入了相应模式。这也是为什么在Secure Boot环境下某些调试工具和内核模块会访问受限的原因。7.2 核签名sbverify启动正常只能说明当前引导链里的文件恰好能被固件接受但到底是哪张证书签的、签的是不是我们自己的db还得用s bverify逐一确认。# 验证内核 sbverify --cert db.crt /boot/vmlinuz-linux # 验证GRUB sbverify --cert db.crt /boot/EFI/BOOT/grubx64.efi # 验证其他EFI启动程序 sbverify --cert db.crt /boot/EFI/EFI/systemd/systemd-bootx64.efi如果s bverify输出Signature verification OK说明目标文件确实由指定的证书签名。这一步特别适合排查“明明Secure Boot是开的但某个启动项就是起不来”的问题——签错了证书、签漏了文件都会导致固件拒绝加载。7.3 查信任根固件DB列表与事件日志最后一步回到固件层面确认db里装的确实是你自己的证书。进入BIOS设置界面找到Secure Boot相关菜单通常有Key Management或DB列表展开后能看到当前db里的证书信息。核对证书的CN字段是否匹配My Signature Database Key。系统内也可以用efi-readvar或efitools读取UEFI变量里的证书列表efi-readvar -v db efi-readvar -v KEK efi-readvar -v PK输出里能看到变量包含的证书列表。用openssl x509 -in db.crt -noout -subject对比一下确认固件里的实际内容跟本地生成的证书一致。这一步做完整个信任链才算闭环。8. 避坑指南我踩过的坑你最好别踩8.1 误把db密钥当KEK更新一锅端我第一次搞的时候图省事没区分密钥文件结果导入KEK时用的是db的证书导入db时用了一堆混乱的esl。等固件切换到User Mode后才发现问题任何对db的更新都验签失败因为固件手上的KEK和实际用来签db的私钥对不上。要修改只能清空密钥回到Setup Mode重来。浪费了一个下午最后还误打误撞把原本的Windows引导链也弄坏了。这个教训就是每一步都要严格执行PK签KEK、KEK签db的层级关系不要想当然觉得“反正都是我的证书签谁都一样”。固件验签时只认变量里存的证书不看你人的意愿。8.2 显卡Option ROM与纯UEFI不兼容有一类问题发生在显卡上表现形式是开了Secure Boot后显卡不亮或者只能在Legacy模式输出。原因在于老显卡的固件里只有传统的Legacy Option ROM没有带签名验证的UEFI GOP驱动。Secure Boot开启时固件会拒绝对这类Option ROM做加载于是显卡连初始化都过不了。网上流传的“HD6450刷UEFI”这类玩法就是给老显卡刷一个UEFI GOP版本的BIOS让它在纯UEFI环境下能被正常识别。如果你也有一块老显卡折腾之前先确认它的Option ROM是否支持UEFI签名。不支持的话要么刷GOP BIOS要么关闭Secure Boot没有第三条路。8.3 双系统下Windows直接进不去这条前面讲过但值得再强调一次。很多人把Secure Boot密钥换成自己的之后Windows下一个开机就挂还以为Windows坏了。实际上就是db里没有微软证书Windows的引导程序过不了验签。解决办法有两个方向如果你已经替换了db把微软证书重新追加进db里去。如果你还没开始直接在主板的Secure Boot设置里用“Append/追加”模式把微软证书和你自己的证书都保留下来。顺带一提Windows 11对Secure Boot和TPM有硬性要求如果你的磁盘还是MBR分区格式固件和Windows安装器会直接给出“这台电脑的磁盘布局不支持UEFI”之类的报错。这时候不是Secure Boot的问题先把磁盘转成GPT再说。8.4 U盘工具盘全军覆没用fbinsttool这类工具做的多功能启动U盘在传统Legacy启动方式下确实好用但到了纯UEFI Secure Boot的环境几乎全部阵亡。原因很简单fbinsttool的PE和DOS工具引导程序大都没有走UEFI签名的标准流程固件根本不认识它们。这也带出一个很实际的结论在改了Secure Boot密钥的机器上救援U盘也得用正规发行版的Live USB而且要优先选择官方带签名的镜像。我用UltraISO烧录的官方Ubuntu镜像在Secure Boot下没问题但某些精简PE工具盘就只能关机了。8.5 老平台、虚拟机与Windows 7的历史遗留早期UEFI平台比如第一代UEFI CPU时代的主板Secure Boot实现很粗糙甚至有的根本没有自定义模式。这种老平台上强行折腾自签密钥不如直接关掉Secure Boot来得省心。虚拟化环境里也有坑。以VMware Workstation为例给虚拟机开启UEFI固件并勾选Secure Boot后它用的是一套固定的模拟固件密钥库被写死用户没法自定义PK。我之前用VMware 17.6装Rocky Linux 9.8时虚拟机里开了Secure Boot反而卡在引导阶段最后把虚拟机的固件切回传统BIOS模式才顺利装上。做试验的时候建议先在VMWare或QEMU里跑通整套流程确认无误再上物理机但别指望虚拟固件能支持全部自定义选项。Windows 7也有类似问题它的EFI引导程序不包含Secure Boot签名验证支持所以用Win7的UEFI安装盘在Secure Boot环境下基本装不上遇到这种组合别浪费时间直接关掉Secure Boot。8.6 常见问题速查表现象直接原因解决办法开机提示Verification failed引导文件未签名或签名不被db信任用sbsign重新签名核对签名证书改装内核后进不去系统内核未重新签名在postinst钩子里自动签内核模块加载失败/被拒绝内核模块未签名用sign-file签名并对齐内核配置Windows双系统进不去db里没有微软证书把微软证书追加到db磁盘是MBR格式装不了Win11系统盘分区表不受UEFI支持用GPT重新分区并格式化老显卡开机黑屏Option ROM无UEFI签名刷GOP BIOS或关Secure BootU盘PE工具启动不了引导程序没有合法签名换官方发行版Live USBBitLocker要求恢复密钥启动链改变触发完整性校验提前备份恢复密钥固件密钥丢失无法修改User Mode下私钥遗失清空固件密钥回Setup Mode重来9. 最后说点个人体会这套Secure Boot自签方案前前后后折腾了我小半个月中间经历了几次开机黑屏、几次固件设置界面往返也踩了不少只有实际操作才会冒出来的坑。最大的感触是Secure Boot并不是一层铁幕它更像一套握手协议只要理解了PK、KEK、db之间的信任关系把每条链路上的签名规则捋顺自己掌控信任根并没有想象中那么难。麻烦的是日常维护——内核升级要签名、GRUB换版本要签名、新加一个EFI工具也得记得签。但把这些流程全部脚本化之后反而觉得比原来装个驱动、升个内核还要心惊胆战的状态踏实得多。如果让我给刚入门的人一个建议那就是先在一台可以随时清空CMOS的备用机上跑通全流程把密钥生成、导入、签名、验证这几个环节全部摸熟再搬到主力机。而且密钥的离线备份一定不能省这是你在整个体系里唯一的“后悔药”。最后分享一个小技巧把你生成的GUID、三级密钥文件清单、导入顺序甚至那些踩过的坑都写在一个Markdown文件里和密钥一起离线备份。几个月后系统升级、固件更新之后回来查看这份笔记的价值远超你折腾当天的记忆。
返回列表