我想将用于签署内核模块的密钥对中的公钥添加到 system_keyring 中。然而,有一个问题:
通过命令cat /proc/keys | grep system_keyring
,我得到了system_keyring的条目(ID)。但是,当尝试使用以下命令添加我的公钥时:keyctl padd asymmetric "" 0xXXXXXXXX</test/signing_key.x509
,我收到“权限被拒绝”错误。
我认为这是由于“module_signing.txt”中描述的限制造成的https://01.org/linuxgraphics/gfx-docs/drm/admin-guide/module-signing.html:
但请注意,内核只允许将密钥添加到 .system_keyring如果新密钥的 X.509 包装器由添加密钥时已驻留在 .system_keyring 中的密钥进行有效签名。
但是,我找不到任何文档来描述如何使用已驻留在 .system_keyring 中的密钥对“X.509 包装器”进行签名。
另外,我认为该密钥环中的密钥只是公钥。因此,即使我可以从密钥环中提取公钥并使用该公钥签署“X.509 包装器”,我什至认为它不会起作用。
无论如何,这里需要一些帮助。或者,即使有东西可以给我一个提示,告诉我如何将我的内核模块提交到 RedHat,以便它可以由 RedHat 签名并安装在用户的安装上,而无需重建内核?
答案1
系统密钥环从五个来源获取其内容:
- 在编译时嵌入内核的密钥(显然如果不重新编译就无法更改)
- UEFI 安全启动变量
db
- 根据您的固件,您可能无法更改此变量 - UEFI 安全启动变量
dbx
- 与前一个一样,但这是一个黑名单,因此您无论如何都不想在此处添加密钥 - 嵌入的密钥
shim.efi
- 不重新编译就无法更改,并且您可能必须在之后重新签名填充程序,除非您已经控制了安全启动PK
=太麻烦了 - UEFI 变量
MOK
(由shim.efi
) - 这可能是您最好的希望。
要将您的密钥导入 MOK,您应该首先确保它shim.efi
参与您的引导过程(请参阅 参考资料efibootmgr -v
)。
然后获得模块以 DER 格式签名的密钥/证书,并使用以下mokutil
命令启动导入过程:
mokutil --import your_signing_key.pub.der
该命令将要求您设置一个新的导入密码:该密码将在下一步中使用,并且不是之前存在的任何密码。像往常一样,设置新密码时,mokutil
将要求您输入该密码两次。
然后,下次重新启动系统时,shim.efi
将看到新的 MOK 密钥已准备好导入,并且它会要求您输入导入密码您在上一步中设置。完成此操作一次后,新密钥将永久存储在 UEFI MOK 变量中,并且内核将自动将其包含在系统密钥环中。
如果您不使用 UEFI,则在不重新编译内核的情况下无法将新密钥添加到系统密钥环。但另一方面,如果未启用安全启动,内核将允许加载没有签名或无法验证签名的内核模块 - 它只是设置一个内核的污点标志来标记非发行版内核模块已被加载。已加载。