Ubuntu系统开启secure boot时运行旧版kernel的签名方法咨询
Ubuntu系统开启secure boot时运行旧版kernel的签名方法咨询
嘿,我太懂你这种左右为难的处境了——既要迁就老闭源软件的内核版本要求,又被Secure Boot卡着不让启动,关键还不能关它,不然闭源驱动直接罢工。别慌,下面给你一套实操的签名流程,亲测在Ubuntu 20.04上可行:
1. 生成专属的内核签名密钥对
首先得准备好签名工具和密钥:
- 先安装依赖工具:
sudo apt update && sudo apt install openssl mokutil - 生成有效期10年的RSA密钥对(私钥+证书),你可以自定义文件名,比如
my_kernel_signing.key和my_kernel_signing.crt:
这里的openssl req -new -x509 -newkey rsa:2048 -keyout my_kernel_signing.key -outform DER -out my_kernel_signing.crt -nodes -days 3650 -subj "/CN=My Custom Kernel Signing Key/"/CN=...是密钥的标识,随便填个好记的名字就行。
2. 将密钥导入Secure Boot的MOK数据库
MOK(Machine Owner Key)是Secure Boot里允许用户自定义信任密钥的机制,我们需要把刚才生成的证书导入进去:
- 执行导入命令,设置一个牢记的密码(重启时要用到):
sudo mokutil --import my_kernel_signing.crt
3. 重启完成MOK密钥注册
这一步不能跳过,不然密钥不会被Secure Boot信任:
- 重启电脑,会进入蓝色的Shim UEFI密钥管理界面(可能显示为
MOK Management) - 依次选择
Enroll MOK→Continue→Yes,输入刚才设置的密码,确认后重启系统。
4. 签名你的5.8内核及模块
现在要给5.8内核镜像和所有内核模块签名:
先确认你的5.8内核版本
用命令查看已安装的5.8内核:
ls /boot | grep vmlinuz-5.8
比如输出可能是vmlinuz-5.8.0-44-generic,记下来这个版本号。
签名内核镜像
替换下面命令里的5.8.0-44-generic为你的实际版本:
sudo /usr/src/linux-headers-5.8.0-44-generic/scripts/sign-file sha256 ./my_kernel_signing.key ./my_kernel_signing.crt /boot/vmlinuz-5.8.0-44-generic
如果提示找不到sign-file,说明没装对应版本的内核头文件,先安装:
sudo apt install linux-headers-5.8.0-44-generic
批量签名内核模块
一个个签模块太麻烦,用脚本批量处理:
MODULE_DIR="/lib/modules/5.8.0-44-generic" for modfile in $(find $MODULE_DIR -name "*.ko"); do sudo /usr/src/linux-headers-5.8.0-44-generic/scripts/sign-file sha256 ./my_kernel_signing.key ./my_kernel_signing.crt $modfile done
5. 验证签名是否成功
- 验证内核镜像签名:
如果能看到你刚才生成的密钥标识(比如sbverify --list /boot/vmlinuz-5.8.0-44-genericMy Custom Kernel Signing Key),说明内核签名成功。 - 验证模块签名(以NVIDIA驱动模块为例):
有输出签名信息就说明模块签名没问题。modinfo /lib/modules/5.8.0-44-generic/kernel/drivers/nvidia/nvidia.ko | grep signature
额外注意事项
- 以后如果5.8内核有更新(比如安全补丁),必须重新签名新的内核镜像和模块,建议把签名脚本保存下来,方便复用。
- 密钥文件(
my_kernel_signing.key和my_kernel_signing.crt)要妥善保存,别弄丢了,不然下次签名还要重新生成导入。
备注:内容来源于stack exchange,提问作者phlegmax
相关产品推荐
相关产品推荐

