Linux

如何在不重新編譯的情況下將公鑰添加到核心的系統密鑰環中?

  • September 3, 2021

我想將用於簽署核心模組的密鑰對中的公鑰添加到 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 簽名並在使用者安裝時安裝而無需重建核心?

系統密鑰環從五個來源獲取其內容:

  • 編譯時嵌入核心的密鑰(顯然不重新編譯就無法更改)
  • UEFI 安全啟動變數db- 根據您的韌體,您可能會也可能無法更改此變數
  • UEFI 安全啟動變數dbx- 與前一個變數一樣,但這是一個黑名單,所以無論如何您都不想在此處添加您的密鑰
  • 嵌入的密鑰- 如果不重新編譯就無法更改,除非您已經控制了安全啟動= 太麻煩了shim.efi,否則您可能必須在之後重新簽署 shimPK
  • 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 章“為安全啟動簽名核心模組”

引用自:https://unix.stackexchange.com/questions/445772