我正在尝试创建一个新的 GRUB 映像,其中嵌入了公钥文件来验证 GRUB 加载的所有文件。所以我使用命令 grub-mkimage 手动创建一个新的 GRUB 核心映像。
grub-mkimage --config='./grub.cfg' --compression='auto' --pubkey='./grub.key' --output='./core_custom.efi' --format='x86_64-efi' --prefix='(hd0,gpt2)/grub' --verbose ext2 fshelp part_gpt pbkdf2 crypto password_pbkdf2 pbkdf2_test
grub.cfg 包含一个具有 pbkdf2 密码的超级用户(这就是我包含 pbkdf2 模块的原因),以防止操纵配置,从而导致密码保护不被加载。我还将变量寻呼机设置为 1。
但是在重新启动我的计算机并从新创建的 GRUB 映像启动后,GRUB 环境变量 check_signatures 未设置为强制执行(就像官方中提到的那样)GRUB2手册),当我在 GRUB shell 中输入 list_trusted 命令时,我传递给 grub-mkimage 命令的密钥并未列出,最后 verify_detached 命令也找不到公钥。
但 grub-mkimage 命令的详细日志清楚地表明密钥已被读取,并且当我在 GRUB shell 中手动加载密钥时,一切正常。
有关我的安装的信息:
-ArchLinux
-GRUB 2.04
-EFI 平台 -> GRUB x86_64-efi
答案1
我遇到了完全相同的问题,经过数小时的反复试验后终于找到了答案。至少可以说,GRUB 方面处理得很差,它只是默默地失败了。文档似乎也没有帮助,我无法找到有关此特定错误的任何有用信息。
解决方案非常简单 - 必须有一些模块预加载。对我来说,使用GRUB 2.04在AMD64, 那些是:
- 验证者
- gcry_sha256
- gcry_sha512
- gcry_dsa
- gcry_rsa
我得到的命令是:
grub-mkstandalone --verbose --format=x86_64-efi --output=grubsax64.efi --pubkey=grub.pub --modules="verifiers gcry_sha256 gcry_sha512 gcry_dsa gcry_rsa" boot/grub/grub.cfg=grub.cfg
这里重要的部分是--模块=“...”。
我还尝试使用加载完全相同的模块插入模块在grub配置文件, 但这行不通,必须像上面概述的那样完成。
根据产生的输出来判断grub-mk独立,这也应该适用于grub 镜像(grub-mk独立在某些时候调用grub 镜像),虽然我自己没有测试过:
grub-mkimage ... verifiers gcry_sha256 gcry_sha512 gcry_dsa gcry_rsa
构建 GRUB 映像/二进制文件,重新启动,输入命令行,您会注意到受信任列表现在产生输出。进一步的测试表明签名检查现在按我的预期工作。
关于 GRUB 2.06 的编辑 21 年 4 月 23 日:
在 GRUB 2.06 中,验证者已从模块移至核心(请参阅这次提交),即它不再是一个单独的模块。因此,上述命令也需要更改:
grub-mkstandalone --verbose --format=x86_64-efi --output=grubsax64.efi --pubkey=grub.pub --modules="gcry_sha256 gcry_sha512 gcry_dsa gcry_rsa" boot/grub/grub.cfg=grub.cfg
grub-mkimage ... gcry_sha256 gcry_sha512 gcry_dsa gcry_rsa