前言

  • 本文操作平台是PVE虚拟机,使用Ubuntu 24.04发行版操作系统
  • 由于环境上开启了BIOS的Secure Boot后无法使用未签名的ko,所以本文介绍如何对ko进行签名使用
  • 这里涉及的所有概念知识不在讨论范围!只是操作教程而已,如有疏漏,可以评论区留言,不胜感激!

解决未签名ko无法使用的问题的方案有两个,一个是进行签名使用,另一个是关闭签名校验或者安全启动

检查

首先如果是因为签名校验失败导致的无法使用ko,则报错如下
load module fail

查看是否打开了Secure Boot

  • 一个办法就是重启进入BIOS中找到对应项进行确认
  • 在Linux环境下查看启动日志,例如在日志没有被冲掉的时候通过dmesg命令查看
    linux start
    如果显示Secure boot disable,则是关闭的

查看内核编译选项

cat /boot/config-xxxx| grep MODULE_SIG
ubuntu config

  • 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项则是有签名
    ko have sign
    否则没有签名
    ko no sign
  • 通过hexdump命令查看ko结尾,如果有Module signature appended字段则是有签名
    ko have sign
    否则没有签名
    ko no sign

签名密钥

签名前需要先创建并且导入密钥,然后通过该密钥进行签名

  • 生成密钥
    生成私钥(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
      期间需要设置一个密码,该密码在下一步导入时使用
      create key
    • 接着重启,在启动时,你将会看到一个蓝色的MOK管理屏幕
      mok start
    • 按照屏幕上的指示选择Enroll MOK选项
      mok input
    • 接着选择Continue,会要求你输入上一步设置好的密码,无误后选择Reboot即可
      mok reboot

至此密钥准备完毕

如果不想用该密钥了,那么可以通过mokutil --delete xxx.der命令进行删除
同样需要设置密码,然后重启进行删除操作,步骤与导入相同

进行签名

该密钥准备好后完善保存,之后可以一直使用该密钥进行签名,签名方式:
/usr/src/linux-headers-xxxx/scripts/sign-file sha256 xxx.key xxx.der xx.ko
签名完成后就可以正常使用了
sign file

参考