跳转到内容

Ubuntu 上为内核模块签名以支持 Secure Boot

当启用 Secure Boot 时,未签名的内核模块会被拒载。本文说明生成密钥、签名模块、使用 mokutil 注册公钥、并验证模块加载的过程。

Terminal window
sudo apt update
sudo apt install -y mokutil openssl kmod
Terminal window
sudo openssl req -new -x509 -newkey rsa:2048 -keyout /root/MOK.priv -out /root/MOK.pem -nodes -days 3650 -subj "/CN=Custom MOK/"
sudo chmod 600 /root/MOK.priv
sudo mokutil --import /root/MOK.pem

按提示设置密码。重启进入 MOK 管理器,使用密码完成密钥注册。

找到模块文件(例如 /lib/modules/$(uname -r)/extra/yourmod.ko),使用内核自带的 scripts/sign-file

Terminal window
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 /root/MOK.priv /root/MOK.pem /lib/modules/$(uname -r)/kernel/drivers/misc/yourmod.ko
sudo depmod -a
sudo modprobe yourmod

模块加载成功时,dmesg 会显示相应的初始化日志。

使用 modinfo 查看签名信息(部分模块会暴露签名字段):

Terminal window
modinfo yourmod | grep signer

也可查看 dmesgjournalctl -k,寻找内核接受签名的消息。

可在 DKMS 的 post-install 脚本中调用 sign-file 来自动签名构建产物。确保签名私钥存在且对应公钥已在机器上注册。

  1. 若模块被拒载,检查 dmesg | grep -i 'sig'journalctl -k 的签名错误信息。
  2. 确认 MOK 已在固件中成功注册。
  3. 确认 sign-file 的路径对应该内核头包,通常位于 /usr/src/linux-headers-$(uname -r)/scripts/
  4. 如无法在无头服务器上完成 MOK 注册,考虑使用远程 KVM,或在受控窗口内临时关闭 Secure Boot 来安装并签名模块,随后重新启用。