我正在运行 AlmaLinux 9(RedHat 9 克隆)并编译了一个新的内核模块。我正在启用 UEFI 和安全启动的虚拟机中运行。当我插入模块时,出现以下错误:
insmod: ERROR: could not insert module npreal2.mod: Key was rejected by service
从其他帖子中我得出的结论是它与 UEFI/安全启动有关。所以我禁用了安全启动,然后 insmod 报告:
insmod: ERROR: could not insert module npreal2.mod: Invalid module format
我尝试在关闭安全模式的情况下重新编译,然后 insmod 工作,但随后我必须禁用安全启动。如何使该模块能够安全启动?
github上有一篇关于创建自己的 MOK 密钥的帖子,但这似乎是 DKMS 特定的。
现在(经过评论中的讨论)您已经有了一个可以工作但未签名的
npreal2.ko
内核模块,我们可以尝试解决安全启动问题。首先,您需要创建一个 X.509 密钥对(公钥和相应的密钥)以用作 MOK。为此,首先创建一个最小的 OpenSSL 配置文件,例如
~/x509.genkey
:该
CN =
行定义了您的 MOK 主要可识别的名称,因此请在其中输入您想要的任何内容。该O =
行将是您的组织名称的位置,但如果您愿意,可以省略整行。现在您可以生成密钥对:
此命令创建一个密钥对,名义上自创建之日起 10 年内有效;如果你想改变它,改变
-days
参数。现在你应该有两个文件:
signing_key.x509
是公钥,您将其注册为 MOK(机器所有者密钥)signing_key.priv
是相应的私钥,您需要用它来签署您自己构建的任何内核模块。此私钥不受密码保护,因此请确保其安全。要注册
signing_key.x509
为 MOK,请确保mokutil
已安装该软件包,然后运行:此命令将要求您为密钥注册过程设置一次性密码。完成此操作后,MOK 注册的第一阶段就完成了。要完成 MOK 注册,您需要重新启动。
当您重新启动时,将
shimx64.efi
检测到您已启动 MOK 注册过程,并将显示一个蓝屏,其中包含一个简单的基于文本的菜单,其中包含 或 的Enroll MOK
选项Continue boot
。选择
Enroll MOK
开始 MOK 注册的第二阶段。然后,您将有机会查看哈希值和CN =
您要注册的密钥行,然后是/否确认,最后是您在上述第一个注册阶段设置的一次性密码。如果注册成功,则不再需要该密码。在蓝屏菜单中选择“Reboot”返回Linux。(注册过程的第二阶段发生在重新引导期间,以确保只有具有对系统的物理等效访问权限的人员才能完成该过程,并且密码确保您正在注册的密钥是您在第一阶段,并且不是由某些恶意软件插入的。)
要验证密钥注册是否成功,您可以
sudo keyctl list %:.platform
以 root 身份运行:它应该显示系统识别的所有安全启动密钥,包括您的 MOK、嵌入在 中的发行版密钥shimx64.efi
以及来自固件的制造商和 Microsoft 密钥。或者,您可以运行
sudo mokutil -l
以获得更详细的发行版密钥和 MOK 列表。现在您已准备好签署内核模块:
要确认签名,请运行
sudo modinfo ./npreal2.ko
:它应该包含一行signer:
包含CN =
您的 MOK 名称的行,以及一个包含十六进制数字的长signature:
块。当然,现在您应该能够在
sudo insmod npreal2.ko
启用安全启动的情况下加载模块!来源: https: //www.redhat.com/sysadmin/secure-boot-systemtap