建立三個金鑰對 - Amazon Elastic Compute Cloud

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

建立三個金鑰對

UEFI 安全開機基於下列用於信任鏈的三個金鑰資料庫:平台金鑰 (PK)、金鑰交換金鑰 (KEK) 和簽章資料庫 (db)。¹

您需在執行個體上建立每個金鑰。若要以對 UEFI 安全開機標準有效的格式準備公有金鑰,請為每個金鑰建立一個憑證。DER 定義 SSL 格式 (格式的二進位編碼)。然後,您可以將每個憑證轉換為 UEFI 簽章清單,該清單為 UEFI 安全開機中所理解的二進位格式。最後,您需使用相關金鑰簽署每個憑證。

準備建立金鑰對

建立金鑰對之前,請建立一個用於金鑰產生的全域唯一識別符 (GUID)。

  1. 連線到執行個體。

  2. 在 shell 提示中執行下列命令。

    uuidgen --random > GUID.txt

金鑰對 1:建立平台金鑰 (PK)

PK 是 UEFI 安全開機執行個體的信任根。私有 PK 用於更新 KEK,其又可接續用於將授權的金鑰新增至簽章資料庫 (db)。

X.509 標準用於建立金鑰對。如需有關標準的資訊,請參閱維基百科上的 X.509

建立 PK
  1. 建立金鑰。您必須將變數命名為 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=Platform key - 金鑰的通用名稱 (CN)。您可以輸入自己的組織名稱,而不是平台金鑰

  2. 建立憑證。

    openssl x509 -outform DER -in PK.crt -out PK.cer
  3. 將憑證轉換至 UEFI 簽章清單。

    cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl
  4. 使用私有 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
  1. 建立金鑰。

    openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj "/CN=Key Exchange Key/" -out KEK.crt
  2. 建立憑證。

    openssl x509 -outform DER -in KEK.crt -out KEK.cer
  3. 將憑證轉換至 UEFI 簽章清單。

    cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl
  4. 使用私有 PK 簽署簽章清單。

    sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth

金鑰對 3:建立簽章資料庫 (db)

db 清單包含授權在系統上開機的授權金鑰。必須使用私有 KEK 才能修改清單。將使用在此步驟中建立的私有金鑰簽署開機映像。

建立 db
  1. 建立金鑰。

    openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=Signature Database key/" -out db.crt
  2. 建立憑證。

    openssl x509 -outform DER -in db.crt -out db.cer
  3. 將憑證轉換至 UEFI 簽章清單。

    cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl
  4. 使用私有 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,創建數據庫和簽名映像的命令來自創建密鑰,由 ArchWiki 維護團隊和/或貢獻者編寫。 ArchWiki