BIOS里开启了Secure Boot的Linux系统,加载第三方模块的时候,会被拒绝。这时候,就需要我们手动给模块签名,才能加载。
具体来说,分成三步:
- 生成证书
- 注册证书
- 签名模块
完成这些工作,需要使用openssl
、mokutil
、sign-file
、xz
等工具。
我们以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.key
和vbox.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