Secure Boot 的Linux系统中添加模块

发布于:2025-09-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

BIOS里开启了Secure Boot的Linux系统,加载第三方模块的时候,会被拒绝。这时候,就需要我们手动给模块签名,才能加载。

具体来说,分成三步:

  • 生成证书
  • 注册证书
  • 签名模块

完成这些工作,需要使用opensslmokutilsign-filexz等工具。

我们以VirtualBox的驱动模块vboxdrv.ko.xz为例。

生成证书

openssl用于生成证书的命令如下:

openssl req -new -x509 -newkey rsa:2048 -keyout vbox.key -outform DER -out vbox.der -nodes -days 3650 -subj "/CN=vbox drivers"

之后,我们会得到vbox.keyvbox.der两个文件:vbox.key是私钥文件,vbox.der是DER格式的证书文件。

注册证书

现在我们使用mokutil工具把vbox.der文件注册到系统中。

执行:

sudo mokutil --import ./vbox.der

执行过程中,会要求输入两次密码。记牢这个密码,然后重启系统。

重启之后,会先进入一个蓝色的导入证书界面,输入刚刚记住的密码,然后系统重启成功之后,执行:

sudo mokutil --list-enrolled

会显示我们系统中的注册的证书。

我们还可以使用mokutil查看Secure Boot的状态:

sudo mokutil --sb-state

或者检测证书是否注册到了系统中:

sudo mokutil --test-key vbox.der

签名模块

如果证书注册成功,这时候就可以使用我们的证书和私钥给我们的模块进行签名了。

签名的工具是使用内核源代码中的sign-file这个工具,这个工具在内核源代码目录的scripts目录中。

在安装了kernel-devel包的系统上,可以简单地通过uname工具加-r参数,拼接出内核的源代码目录。

如:

export signfile=/usr/src/kernels/$(uname -r)/scripts/sign-file

后面就可以使用$signfile工具了。

sign-file的语法为:

sign-file [alg] [key] [der] [.ko]

比如我们给vboxdrv.ko签名,就可以执行:

$signfile sha256 vbox.key vbox.der $(modinfo -n vboxdrv.ko)

执行成功之后,就可以正常加载模块了。

压缩模块

如果我们是通过kmod-VirtualBox安装的模块,会发现三个模块都是xz格式。

我们不能使用sign-file工具签名这种压缩文件,需要先解压出来,再签名。

如:

xz -d vboxdrv.ko 
$signfile sha256 vbox.key vbox.der vboxdrv.ko

这时候,就可以使用modprobe vboxdrv命令加载模块了。

需要注意的是,如果我们想把模块重新压缩成xz格式,需要指定CRC32校验。xz默认使用CRC64校验,内核不支持。

即,压缩回去需要执行:

xz -C crc32 vboxdrv.ko

网站公告

今日签到

点亮在社区的每一天
去签到