如何在不重新编译的情况下将公钥添加到内核的系统密钥环中?

如何在不重新编译的情况下将公钥添加到内核的系统密钥环中?

我想将用于签署内核模块的密钥对中的公钥添加到 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,则在不重新编译内核的情况下无法将新密钥添加到系统密钥环。但另一方面,如果未启用安全启动,内核将允许加载没有签名或无法验证签名的内核模块 - 它只是设置一个内核的污点标志来标记非发行版内核模块已被加载。已加载。

来源:RHEL 7 内核管理指南,第 2.8 章“为安全启动签署内核模块”

相关内容