我正在 UEFI 中编写自己的操作系统加载程序(引导加载程序)。操作系统加载程序是 Microsoft 签名的,因此它可以在安全启动下运行。OS Loader 将能够根据用户的选择加载 Windows 或 Linux Kernel(类似于 GRUB) 因为我将 Linux Kernel 构建为 EFI Stub,所以我可以从我的 OS Loader 加载它。
但是,我有一个具体的要求。我将对 Linux 内核进行自签名。
如何建立信任链以确保我加载的是我自己的自签名 Linux 内核而不是其他未签名的内核?
根据电信公司的建议于 2022 年 1 月 21 日编辑
继续 telcoM 的回答,我从https://github.com/rhboot/shim下载了 SHIM 源,我还在https://www.rodsbooks.com/efi-bootloaders/secureboot.html#initial_shim
之后创建了 PKI 密钥
$ openssl req -new -x509 -newkey rsa:2048 -keyout MOK.key -out MOK.crt -nodes -days 3650 -subj "/CN=Your Name/"
$ openssl x509 -in MOK.crt -out MOK.cer -outform DER
使用构建的 SHIM 源
make VENDOR_CERT_FILE=MOK.cer
用 MOK.key 签署了我的 kernel.efi 以获得签署的 grubx64.efi(这是因为 SHIM 中的默认加载器是 grubx64.efi。我只是继续使用默认值)
sbsign --key MOK.key --cert MOK.crt --output grubx64.efi kernel.efi
最后,使用 shimx64.efi 作为 loader.efi (使用 PreLoader https://blog.hansenpartnership.com/linux-foundation-secure-boot-system-released/)因为目前我没有微软签署的 shimx64.efi . 此外,mmx64.efi 和 fbx64.efi 也通过 HashTool.efi 与 shimx64.efi (loader.efi) 一起注册
这是流程。
PreLoader.efi --> loader.efi(shimx64.efi) --> grubx64.efi(kernel.efi)
禁用 SecureBoot 后,一切正常,我可以启动 Linux 内核。
但是,启用 SecureBoot 后,我无法启动 grubx64.efi 映像。
进一步更新
我发现我应该使用 MokManager (mmx64.efi) 来注册 MOK.cer。尝试使用 mmx64.efi 并注册 MOK.cer。但是,看起来 Key 没有成功注册。
我错过了什么吗?