我正在运行 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
启用安全启动的情况下加载模块!