Ubuntu下给驱动签名
前言
- 本文操作平台是PVE虚拟机,使用Ubuntu 24.04发行版操作系统
- 由于环境上开启了BIOS的
Secure Boot
后无法使用未签名的ko,所以本文介绍如何对ko进行签名使用 - 这里涉及的所有概念知识不在讨论范围!只是操作教程而已,如有疏漏,可以评论区留言,不胜感激!
解决未签名ko无法使用的问题的方案有两个,一个是进行签名使用,另一个是关闭签名校验或者安全启动
检查
首先如果是因为签名校验失败导致的无法使用ko,则报错如下
查看是否打开了Secure Boot
- 一个办法就是重启进入BIOS中找到对应项进行确认
- 在Linux环境下查看启动日志,例如在日志没有被冲掉的时候通过dmesg命令查看
如果显示Secure boot disable
,则是关闭的
查看内核编译选项
cat /boot/config-xxxx| grep MODULE_SIG
- CONFIG_MODULE_SIG : 模块签名验证功能, 配置为‘y’后, 还有如下的子选项可以配置
- CONFIG_MODULE_SIG_FORCE :是否验证模块的签名, 配置为‘n’时, 对于未签名或者使用无效的key签名的模块, 内核都允许加载, 但是kernel会被标记为被感染(tainted), 并且使用商业许可的模块也会被标记为被感染, 若配置为‘y’, 则只有正确签名的模块才能被允许加载, 其他的模块将被拒绝加载, 并且kernel会打出错误信息
- CONFIG_MODULE_SIG_ALL : 若配置为’n’, 则在build kernel的过程中, 所有的模块都不会被签名, 需要自己手动签名, 若被配置为‘y’, 则在build kernel的 “modules_install”阶段, 所有的模块都会被自动签名
查看使用的ko是否有签名
- 通过modinfo命令查看ko信息,如果有signature项则是有签名
否则没有签名 - 通过hexdump命令查看ko结尾,如果有
Module signature appended
字段则是有签名
否则没有签名
签名密钥
签名前需要先创建并且导入密钥,然后通过该密钥进行签名
- 生成密钥
生成私钥(xxx.key)和公钥(xxx.der), 证书名字为xxxx
openssl req -new -x509 -newkey rsa:2048 -keyout xxx.key -outform DER -out xxx.der -nodes -days 36500 -subj "/CN=xxxx"
- 导入证书
这一步需要期间重启操作,如果只是生成了密钥,但是没有实际导入,那么通过该密钥进行签名的ko同样不可用- 首先使用命令导入密钥到MOK证书列表
mokutil --import xxx.der
期间需要设置一个密码,该密码在下一步导入时使用 - 接着重启,在启动时,你将会看到一个蓝色的MOK管理屏幕
- 按照屏幕上的指示选择
Enroll MOK
选项 - 接着选择
Continue
,会要求你输入上一步设置好的密码,无误后选择Reboot
即可
- 首先使用命令导入密钥到MOK证书列表
至此密钥准备完毕
如果不想用该密钥了,那么可以通过
mokutil --delete xxx.der
命令进行删除
同样需要设置密码,然后重启进行删除操作,步骤与导入相同
进行签名
该密钥准备好后完善保存,之后可以一直使用该密钥进行签名,签名方式:/usr/src/linux-headers-xxxx/scripts/sign-file sha256 xxx.key xxx.der xx.ko
签名完成后就可以正常使用了
参考
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 追逐笔记!
评论