本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
建立三個金鑰對
UEFI 安全開機基於下列用於信任鏈的三個金鑰資料庫:平台金鑰 (PK)、金鑰交換金鑰 (KEK) 和簽章資料庫 (db)。¹
您需在執行個體上建立每個金鑰。若要以對 UEFI 安全開機標準有效的格式準備公有金鑰,請為每個金鑰建立一個憑證。DER
定義 SSL 格式 (格式的二進位編碼)。然後,您可以將每個憑證轉換為 UEFI 簽章清單,該清單為 UEFI 安全開機中所理解的二進位格式。最後,您需使用相關金鑰簽署每個憑證。
準備建立金鑰對
建立金鑰對之前,請建立一個用於金鑰產生的全域唯一識別符 (GUID)。
-
在 shell 提示中執行下列命令。
uuidgen --random > GUID.txt
金鑰對 1:建立平台金鑰 (PK)
PK 是 UEFI 安全開機執行個體的信任根。私有 PK 用於更新 KEK,其又可接續用於將授權的金鑰新增至簽章資料庫 (db)。
X.509 標準用於建立金鑰對。如需有關標準的資訊,請參閱維基百科上的 X.509
建立 PK
-
建立金鑰。您必須將變數命名為
PK
。openssl req -newkey rsa:4096 -nodes -keyout PK.key -new -x509 -sha256 -days 3650 -subj "/CN=
Platform key
/" -out PK.crt指定了下列參數:
-
-keyout PK.key
- 私有金鑰檔案。 -
-days 3650
- 憑證有效的天數。 -
-out PK.crt
- 用於建立 UEFI 變數的憑證。 -
CN=
- 金鑰的通用名稱 (CN)。您可以輸入自己的組織名稱,而不是Platform key
平台金鑰
。
-
-
建立憑證。
openssl x509 -outform DER -in PK.crt -out PK.cer
-
將憑證轉換至 UEFI 簽章清單。
cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
-
使用私有 PK (自我簽署) 簽署 UEFI 簽章清單。
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt PK PK.esl PK.auth
金鑰對 2:建立金鑰交換金鑰 (KEK)
私有 KEK 用於將金鑰新增至 db,這是要在系統上開機使用的授權簽章清單。
建立 KEK
-
建立金鑰。
openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj "/CN=Key Exchange Key/" -out KEK.crt
-
建立憑證。
openssl x509 -outform DER -in KEK.crt -out KEK.cer
-
將憑證轉換至 UEFI 簽章清單。
cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
-
使用私有 PK 簽署簽章清單。
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth
金鑰對 3:建立簽章資料庫 (db)
db 清單包含授權在系統上開機的授權金鑰。必須使用私有 KEK 才能修改清單。將使用在此步驟中建立的私有金鑰簽署開機映像。
建立 db
-
建立金鑰。
openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=Signature Database key/" -out db.crt
-
建立憑證。
openssl x509 -outform DER -in db.crt -out db.cer
-
將憑證轉換至 UEFI 簽章清單。
cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
-
使用私有 KEK 簽署簽章清單。
sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db db.esl db.auth
使用私有金鑰簽署開機映像 (核心)
若為 Ubuntu 22.04,下列映像需要簽章。
/boot/efi/EFI/ubuntu/shimx64.efi
/boot/efi/EFI/ubuntu/mmx64.efi
/boot/efi/EFI/ubuntu/grubx64.efi
/boot/vmlinuz
簽署映像
使用下列語法簽署映像。
sbsign --key db.key --cert db.crt --output
/boot/vmlinuz
/boot/vmlinuz
注意
您必須簽署所有新核心。
通常會以符號連結到上次安裝的核心。/boot/vmlinuz
請參閱您的發行版本說明文件,了解您的開機鏈和所需映像。
¹ 感謝 ArchWiki 社區對他們所做的所有工作。用於創建 PK,創建 KEK,創建數據庫和簽名映像的命令來自創建密鑰