UEFI安全启动下无法签名VirtualBox内核模块:sign-key无作用
我之前在Dell XPS 13 9360的Ubuntu系统上碰到过一模一样的情况——照着指南生成了MOK密钥,执行签名命令返回0(提示成功),但用modinfo查看vboxdrv.ko时完全看不到签名相关的字段,安全启动下模块还是加载失败。下面是我排查和解决的全过程:
1. 先检查签名命令是否用错了
你提到的sign-key脚本大概率是笔误,Linux内核里用来签名内核模块的标准工具是sign-file,路径确实是/usr/src/linux-headers-$(uname -r)/scripts/sign-file。如果用错了脚本,虽然可能返回退出码0,但实际根本没完成签名操作。
正确的签名命令应该是这样的(记得替换成你的密钥文件路径):
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 /path/to/your/MOK.priv /path/to/your/MOK.der ./vboxdrv.ko
关键注意点:
- 必须用
sudo执行,否则会因为文件权限问题导致签名失败(但可能依然返回0,坑得很) - 要确保
MOK.priv和MOK.der的路径完全正确,就是你之前生成密钥时保存的位置
2. 验证模块是否真的被成功签名
如果执行了正确的sign-file命令,还是看不到modinfo的签名信息,可以用openssl来验证签名有效性:
openssl dgst -sha256 -verify /path/to/your/MOK.pub -signature <(tail -c 256 ./vboxdrv.ko) ./vboxdrv.ko
如果返回Verified OK,说明签名是有效的,只是某些内核版本的modinfo不会显示签名相关字段;如果返回验证失败,那说明签名过程确实有问题,需要重新检查密钥文件和命令参数。
3. 确认MOK密钥已经导入UEFI安全启动数据库
就算模块签了名,如果你的MOK密钥没被导入到UEFI的安全启动信任列表里,系统还是会拒绝加载模块。可以用下面的命令检查已导入的密钥:
mokutil --list-enrolled
如果看不到你的密钥指纹,说明之前的密钥导入步骤没做好,需要重新执行:
sudo mokutil --import /path/to/your/MOK.der
执行后重启系统,在UEFI弹出的MOK管理界面里完成密钥的验证和导入(注意要记住你设置的导入密码)。
4. 替换系统中的原模块文件
很多人会忽略这一步:只签名了自己复制出来的vboxdrv.ko,但系统实际加载的是/lib/modules/$(uname -r)/misc/vboxdrv.ko这个路径下的文件。所以签名完成后,一定要把签名好的模块替换到系统路径:
sudo cp ./vboxdrv.ko /lib/modules/$(uname -r)/misc/ sudo depmod -a
之后可以手动加载模块试试:
sudo modprobe vboxdrv
如果没有报错,就说明模块已经能正常加载了。
关于modinfo不显示签名信息的说明
如果上面的步骤都完成了,模块能正常加载,但modinfo还是不显示签名相关字段,这是正常的——部分Linux内核版本的modinfo工具不会输出签名元数据,但这不影响模块的合法性,只要安全启动下能加载就说明签名已经生效了。
内容的提问来源于stack exchange,提问作者Gargravarr

