我想将用于签署内核模块的密钥对中的公钥添加到 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中描述的限制:
但是请注意,如果新密钥的 X.509 包装器由在添加密钥时已驻留在 .system_keyring 中的密钥有效签名,则内核将只允许将密钥添加到 .system_keyring。
但是,我找不到任何文档来描述如何使用已驻留在 .system_keyring 中的密钥对“X.509 包装器”进行签名。
另外,我认为该密钥环中的密钥只是公钥。所以,我什至认为它不会起作用,即使我可以从密钥环中提取公钥并用该公钥签署“X.509 包装器”。
无论如何,这里需要一些帮助。或者,即使有些东西可以给我提示如何将我的内核模块提交给 RedHat,以便它可以由 RedHat 签名并在用户安装时安装而无需重建内核?
系统密钥环从五个来源获取其内容:
db
- 根据您的固件,您可能会也可能无法更改此变量dbx
- 与前一个变量一样,但这是一个黑名单,所以无论如何您都不想在此处添加您的密钥shim.efi
- 如果不重新编译就无法更改,并且您可能必须在之后重新签署 shim,除非您已经控制了您的安全启动PK
= 太麻烦了MOK
(由 使用shim.efi
) - 这可能是您最大的希望。要将您的密钥导入 MOK,您应该首先确保它
shim.efi
参与了您的引导过程(请参阅 参考资料efibootmgr -v
)。然后拥有您的模块以 DER 格式签名的密钥/证书,并使用以下
mokutil
命令开始导入过程:该命令将要求您设置新的导入密码:此密码将在下一步中使用,而不是之前存在的任何密码。像往常一样设置新密码时,
mokutil
会要求您输入此密码两次。然后,下次重新启动系统时,
shim.efi
将看到一个新的 MOK 密钥已准备好导入,它会要求您输入您在上一步中设置的导入密码。完成此操作一次后,新密钥将永久存储在 UEFI MOK 变量中,内核将自动将其包含在系统密钥环中。如果您不使用 UEFI,则无法在不重新编译内核的情况下将新密钥添加到系统密钥环。但另一方面,如果未启用安全启动,内核将允许加载没有签名或无法验证签名的内核模块——它只是设置内核的一个污点标志来标记一个非分发内核模块已被加载。
来源:RHEL 7 内核管理指南,第 2.8 章“为安全启动签名内核模块”