如何签署您的内核和引导加载程序?

sxk*_*xkx 6 grub2 lubuntu signature

如何签署您的内核和引导加载程序?

如何对我的内核和引导加载程序进行签名?

更新(2021 年 2 月 4 日) 我认为我没有明确说明我正在尝试做什么。我想取消 OEM 密钥,只使用我自己的密钥。我正在尝试使用全盘加密运行安全启动,包括Boot

准备

  1. 禁用安全启动删除现有密钥
  2. 下载并安装mikos/cryptboot工具。
  3. 安装软件包依赖项(自述文件中列出)

加密启动配置

对配置文件进行了一些更改(这些是我为反映我的设置而进行的更改)。

# Encrypted boot device name (/dev/mapper/$BOOT_CRYPT_NAME)
# (have to be specified in /etc/crypttab)
BOOT_CRYPT_NAME="LUKS_BOOT"

# Boot entry in UEFI Boot Manager (if using GRUB boot loader)
EFI_ID_GRUB="ubuntu"

# Path to GRUB boot loader EFI file (relative to EFI System partition)
EFI_PATH_GRUB="EFI/ubuntu/grubx64.efi"
Run Code Online (Sandbox Code Playgroud)

采取的步骤

# Create and enroll keys (must be in setup mode, verify with bootctl)
cryptboot-efikeys create
cryptboot-efikeys enroll

# Sign kernel
cryptboot-efikeys sign /boot/vmlinuz-5.4.0-65-generic

# Sign bootloader
cryptboot update-grub
Run Code Online (Sandbox Code Playgroud)

当我重新启动并启用安全启动时,我会收到此错误:

error: Secure Boot forbids loading module from (cryptouuid/abcdef0123456789)/grub/x86_64-efi/normal.mod
Run Code Online (Sandbox Code Playgroud)

当我通过捆绑/预加载(使用--modules参数 on grub-install)模块来修复该问题时,我收到此错误:

error: /vmlinuz-5.4.0-65-generic has invalid signature.
error: you need to load the kernel first

Press any key to continue...
Run Code Online (Sandbox Code Playgroud)

当我验证签名时,我得到一个输出,显示它有多个签名,但它们没问题:

  1. 规范签名
  2. 我的自定义签名

所以我想也许删除 Canonical 签名会有所帮助。找到了一个名为 的程序pesign,它可以让我从二进制文件中删除签名。我删除了 Canonical 签名,然后通过运行以下命令验证签名是否仍然正常:

error: Secure Boot forbids loading module from (cryptouuid/abcdef0123456789)/grub/x86_64-efi/normal.mod
Run Code Online (Sandbox Code Playgroud)

一切似乎都很好,它说签名有效(OK)。当我重新启动时,我仍然遇到与以前相同的错误。不要认为这是问题所在(上面有 Canonicals 签名)。

附加信息

我已仔细检查我的钥匙是否已正确注册。

error: /vmlinuz-5.4.0-65-generic has invalid signature.
error: you need to load the kernel first

Press any key to continue...
Run Code Online (Sandbox Code Playgroud)

双重检查

cryptboot-efikeys verify /boot/vmlinuz-5.4.0-65-generic
Run Code Online (Sandbox Code Playgroud)

当我运行时mokutil --list-enrolled,它告诉我 MOK 列表为空。

cryptboot-efikeys list
# All UEFI Secure Boot keys enrolled in your UEFI firmware:
# Variable PK, length 835
# PK: List 0, type X509
#   ...
# Variable KEK, length 837
# KEK: List 0, type X509
#   ...
# Variable db, length 835
# db: List 0, type X509
#   ...
# Variable dbx, length -4
# Variable MokList has no entries
Run Code Online (Sandbox Code Playgroud)

在查看各种指南和文章时,他们都说在导入密钥时mokutil会提示您输入密码,然后必须重新启动并选择所需的密钥。然后在重新启动后验证密钥是否已正确注册。

由于我的输出mokutil --list-enrolled显示列表为空,我感觉这就是导致我看到的错误的原因。我已经通读了该cryptboot-efikeys脚本,它没有mokutil在任何地方使用,也许这有帮助。

我的钥匙已经注册,mokutil不会拿走它们,所以如果这导致了问题,我不知道如何解决它,而不需要放弃cryptboot并自己完成所有操作,我宁愿不必这样做。

还尝试了该grub-efi-amd64-signed软件包,该软件包将为您提供使用该--uefi-secure-boot选项的选项grub-install,但这似乎没有任何区别。

系统和环境信息

  • 乌班图20.04
  • GRUB2.04
  • 核心5.4.0-65

更新(2021 年 2 月 4 日)

我已经放弃了该cryptboot工具并开始手动执行所有步骤。不拿走我的密钥的问题mokutil仍然存在,但是如果我首先将密钥加载到 MOK 中,然后加载到 UEFI 中,一切都会正常。

我后来发现删除它grub-efi-amd64-signed会导致您丢失shimx64.efimmx64.efi,这可能是我无法启动 MokManager 以及安全启动无法正常工作的原因。

我没有grub-efi-amd64-signed安装,而是尝试grub-install在安装时shim运行grub-efi-amd64。没有给我shimx64.efi因此无法启动 MokManager 的信息。我可以通过复制/usr/lib/shim/shimx64.efi/boot/efi/EFI/ubuntu/然后将其添加为启动项来克服这个问题efibootmgr。这会让我在重新启动时运行 MokManger,但仍然会添加默认键(稍后会详细介绍默认键)。

退后一步,在没有任何加密的情况下重新安装了我的系统,只是为了看看普通的 Ubuntu 20.04 在设置方面会做什么。我可以仅使用我自己的密钥(有点)在普通 Ubuntu 20.04 桌面安装上设置安全启动。

使用添加密钥时,mokutil --import key.der我还获得了 Microsoft shim 签名密钥和 Canonical 安全启动签名密钥。这是我不想要的,但还不能确定,因为我不完全理解 MOK 键的作用。mokutil无法使用 MOK 删除 Microsoft 和 Canonical 密钥。我现在正在研究从源代码编译填充程序,希望默认密钥没有注册。