Kernel

從 Microsoft 簽名作業系統載入程序載入 UEFI 自簽名核心

  • January 21, 2022

我正在 UEFI 中編寫自己的作業系統載入程序(引導載入程序)。作業系統載入程序是 Microsoft 簽名的,因此它可以在安全啟動下執行。OS Loader 將能夠根據使用者的選擇載入 Windows 或 Linux Kernel(類似於 GRUB)因為我將 Linux Kernel 建構為 EFI Stub,所以我可以從我的 OS Loader 載入它。

但是,我有一個具體的要求。我將對 Linux 核心進行自簽名。

如何建立信任鏈以確保我載入的是我自己的自簽名 Linux 核心而不是其他未簽名的核心?

根據電信公司的建議於 2022 年 1 月 21 日編輯

繼續 telcoM 的回答,我從https://github.com/rhboot/shim下載了 SHIM 源我還在https://www.rodsbooks.com/efi-bootloaders/secureboot.html#initial_shim

之後創建了 PKI 密鑰

$ openssl req -new -x509 -newkey rsa:2048 -keyout MOK.key -out MOK.crt -nodes -days 3650 -subj "/CN=Your Name/"
$ openssl x509 -in MOK.crt -out MOK.cer -outform DER

使用建構的 SHIM 源

make VENDOR_CERT_FILE=MOK.cer

用 MOK.key 簽署了我的 kernel.efi 以獲得簽署的 grubx64.efi(這是因為 SHIM 中的預設載入器是 grubx64.efi。我只是繼續使用預設值)

sbsign --key MOK.key --cert MOK.crt --output grubx64.efi  kernel.efi

最後,使用 shimx64.efi 作為 loader.efi (使用 PreLoader https://blog.hansenpartnership.com/linux-foundation-secure-boot-system-released/)因為目前我沒有微軟簽署的 shimx64.efi . 此外,mmx64.efi 和 fbx64.efi 也通過 HashTool.efi 與 shimx64.efi (loader.efi) 一起註冊

這是流程。

PreLoader.efi –> loader.efi(shimx64.efi) –> grubx64.efi(kernel.efi);

禁用 SecureBoot 後,一切正常,我可以啟動 Linux 核心。

但是,啟用 SecureBoot 後,我無法啟動 grubx64.efi 映像。

進一步更新

我發現我應該使用 MokManager (mmx64.efi) 來註冊 MOK.cer。嘗試使用 mmx64.efi 並註冊 MOK.cer。但是,看起來 Key 沒有成功註冊。

我錯過了什麼嗎?

您的作業系統載入程序需要包含您將用於簽署自己的核心的密鑰的公共部分(也稱為證書)的副本。每當該密鑰發生更改時,您都需要讓您的 OS Loader 由 Microsoft 重新簽名。

您可能想研究shimx64.efi許多主要發行版用來處理安全啟動的安全啟動 shim 引導載入程序的原始碼:

https://github.com/rhboot/shim


或者,您必須將核心簽名密鑰的公共部分的副本添加到dbUEFI NVRAM 變數中。通常這只有在您替換系統上的安全啟動主鍵(PKUEFI NVRAM 變數)時才有可能。這取決於您系統的韌體實現如何(或實際上是否)可以做到這一點。

常見的可能方式:

  1. 如果您的 UEFI 韌體設置(“BIOS 設置”)包含直接編輯安全啟動密鑰庫的方法,則可用於將核心簽名密鑰直接添加到db變數中。您可能必須先重置或更換PK主鍵,見下文。
  2. 如果您的 UEFI 韌體設置不包括直接編輯安全啟動密鑰庫的方法,但包括將PK安全啟動的主密鑰歸零的方法,這足以讓您入門。在Secure Boot Setup ModePK中將 Secure Boot 的位置清零,在該模式下可以啟動任何核心並且可以編輯所有 Secure Boot 密鑰庫。當新的安全啟動主密鑰(即類似於為安全啟動簽署核心所使用的數字證書)儲存到密鑰庫變數時,設置模式結束。PK

安全啟動設置模式下,所有安全啟動密鑰庫都應可由作業系統級程序編輯,例如efivar https://github.com/vathpela/efivar.gitsbsigntools https://git.kernel.org/pub/scm/例如linux/kernel/git/jejb/sbsigntools.git。在實踐中,這並不總是有效;它取決於系統特定韌體中 UEFI 實現的屬性。

如果您的韌體不允許通過作業系統級別的程序編輯安全啟動密鑰庫,您可能會使用 UEFI 模式工具獲得更好的運氣,例如包KeyTool.efi中的: https ://git.kernel.org/pub/scm/linux/核心/git/jejb/efitools.gitefitools

(可以保護 UEFI NVRAM 變數,以便它們只能由啟動時.efi程序訪問,而不是由正常作業系統訪問;我已經看到一些 UEFI 實現似乎以這種方式限制安全啟動密鑰庫,儘管安全啟動規範沒有要求。)

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