Insmod 导致密钥被服务拒绝

Insmod 导致密钥被服务拒绝

我正在运行 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 特定的。

答案1

现在(经过评论中的讨论)您已经有了一个可以工作但未签名的npreal2.ko内核模块,我们可以尝试解决安全启动问题。

首先,您需要创建一个 X.509 密钥对(公钥和相应的密钥)以用作 MOK。为此,首先创建一个最小的 OpenSSL 配置文件,例如~/x509.genkey

[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
x509_extensions = myexts

[ req_distinguished_name ]
O = ModuleType
CN = ModuleType module signing key

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid

CN =行定义了您的 MOK 主要可识别的名称,因此请在其中输入您想要的任何内容。该O =行将是您的组织名称的位置,但如果您愿意,可以省略整行。

现在您可以生成密钥对:

openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 \
    -batch -config x509.genkey -outform DER \
    -out signing_key.x509 \
    -keyout signing_key.priv

此命令创建一个密钥对,名义上自创建之日起 10 年内有效;如果你想改变它,改变-days参数。

现在你应该有两个文件:

  • signing_key.x509是公钥,您将其注册为 MOK(机器所有者密钥)
  • signing_key.priv是相应的私钥,您需要用它来签署您自己构建的任何内核模块。这个私钥是不是受密码保护,因此请确保其安全。

要注册signing_key.x509为 MOK,请确保mokutil已安装该软件包,然后运行:

sudo mokutil --import signing_key.x509

此命令将要求您为密钥注册过程设置一次性密码。完成此操作后,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 列表。

现在您已准备好签署内核模块:

/usr/src/kernels/$(uname -r)/scripts/sign-file sha256 \
    ~/signing_key.priv \
    ~/signing_key.x509 \
    /some/where/npreal2.ko   # adjust the paths as needed

要确认签名,请运行sudo modinfo ./npreal2.ko:它应该包含一行 signer:包含您的 MOK 名称的行CN =,以及一个signature:包含十六进制数字的长块。

当然,现在您应该能够在sudo insmod npreal2.ko启用安全启动的情况下加载模块!

来源:https://www.redhat.com/sysadmin/secure-boot-systemtap

相关内容