UEFI Secure Boot环境下PXE引导Ubuntu 22.04遭遇签名错误的合规解决方案咨询(不关闭Secure Boot)
嘿,我完全理解你不想关闭Secure Boot的诉求——毕竟这是保障系统安全的重要机制,咱们直接来解决问题,不用绕路。先理清楚你遇到的核心问题:换用bootx64.efi.dualsigned后能顺利进入GRUB,但加载ISO内的内核时触发签名校验失败,这是因为ISO里的vmlinuz和PXE引导的上下文不匹配,导致Secure Boot不认它的签名。下面给你两个靠谱的解决方案:
方案一:直接使用Ubuntu官方适配Secure Boot的Netboot资源(最省心)
Ubuntu官方其实提供了专门用于PXE引导的签名文件,完全适配Secure Boot,不用自己折腾签名。步骤如下:
- 下载Ubuntu 22.04的amd64 netboot压缩包(比如
netboot.tar.gz) - 解压到你的TFTP根目录,替换掉原来从ISO里拷贝的文件
- 调整TFTP路径配置,让PXE引导指向netboot目录下的
grubx64.efi和内核文件
这些文件已经被Microsoft UEFI CA和Ubuntu自己的签名机构双重签名,BIOS的Secure Boot会直接信任,不用做额外配置。
方案二:手动签名内核(适合自定义场景)
如果一定要用ISO里的内核文件,你需要给内核添加被BIOS信任的签名,步骤有点繁琐,但可控:
创建并导入自签名证书到BIOS
Secure Boot只信任预安装在BIOS里的证书,所以你得先生成自己的签名证书,然后导入BIOS:# 生成自签名密钥对和证书(有效期10年) openssl req -new -x509 -newkey rsa:2048 -keyout my_secure_boot_key.pem -out my_secure_boot_cert.pem -days 3650 -nodes -subj "/CN=My PXE Signing Key/" # 转换成BIOS能识别的DER格式 openssl x509 -in my_secure_boot_cert.pem -outform DER -out my_secure_boot_cert.cer然后进入你的NUC的BIOS设置,找到Secure Boot相关选项(一般叫“Enroll Signature”或“Manage Secure Boot Keys”),导入这个
my_secure_boot_cert.cer文件。用sbsign工具签名内核
Ubuntu自带的sbsign工具可以给PE格式的内核签名:sbsign --key my_secure_boot_key.pem --cert my_secure_boot_cert.pem --output vmlinuz.signed /path/to/iso/vmlinuz调整GRUB配置
修改你的PXE GRUB配置文件,让它指向签名后的vmlinuz.signed,而不是原来的vmlinuz。
关于你的几个疑问解答
为什么
bootx64.efi.dualsigned能启动但sbverify验证失败?
这个文件同时包含了Ubuntu和Microsoft的签名,BIOS里已经预装了这两个机构的根CA,所以能通过校验;但你的本地sbverify没有导入对应的公钥,所以验证失败,这是正常现象,不用在意。sbattach工具怎么用?
sbattach主要是给EFI可执行文件(比如grubx64.efi、bootx64.efi)附加签名或证书用的,内核是PE格式,用sbsign更合适。如果要给GRUB文件签名,也可以用sbsign,操作和签名内核类似。哪里找官方证书?
Ubuntu用的Microsoft UEFI CA和Ubuntu CA都是预装在大部分现代BIOS里的,你不需要手动下载;如果要手动获取,可以从Ubuntu的安全仓库里找到,但其实没必要——用方案一的netboot资源最省事。
备注:内容来源于stack exchange,提问作者Mubeen

