如何查询EFI签名

如何查询EFI签名

看来 Grub-EFI 只会引导“签名”的 Linux 内核。有什么命令可以让我询问给定的内核映像以找出其上存在哪些签名(如果有)?

答案1

这取决于您所谈论的签名类型。如果您有 EFI 系统,则可以对 EFI 可执行文件进行签名 ( *.efi) 并强制您的 EFI 固件仅执行具有已知签名的文件。这被称为安全启动。要检查 EFI 二进制文件的签名,您可以使用该工具sbverify

$ sbverify --no-verify signed-binary.efi
Signature verification OK
$ sbverify --no-verify unsigned-binary.efi
No signature table present
Unable to read signature data from unsigned-binary.efi
Signature verification failed

不幸的是,我没有找到提取和显示 EFI 签名的简单方法。 :(

您更可能需要的是 GRUB 自身检查要启动的模块和内核是否有有效签名的能力(安全启动只会影响 GRUB 二进制文件本身,GRUB 加载的所有内容不一定需要 EFI 签名)。这些是(据我所知)普通的旧分离 GPG 签名(例如,对于名为的内核,您将拥有一个带有签名的vmlinuz-1.2.3文件)。vmlinuz-1.2.3.sig这些可以简单地显示和验证

$ gpg --verify vmlinuz-1.2.3.sig vmlinuz-1.2.3
gpg: Signature made Tue Apr  1 12:34:56 2014 CEST using RSA key ID d3adb33f
gpg: Good signature from "John Doe <[email protected]>"

*.sig如果您的内核没有文件,那么它显然没有签名。

您可以通过set check_signature=no在 GRUB 命令提示符下输入来禁用 GRUB 中的签名检查。您可以获得有关该主题的更多信息这里(这个功能比较新,GRUB官方网站上只有2.00版本的在线手册,缺少这个功能)。这也解释了如何使用您自己的密钥对模块和内核进行签名并告诉 GRUB。

答案2

您可以使用sbverify,例如:

# sbverify --list /efi/EFI/refind/shimx64.efi.signed
warning: data remaining[1159744 vs 1322936]: gaps between PE/COFF sections?
signature 1
image signature issuers:
 - /C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/CN=Microsoft Corporation UEFI CA 2011
image signature certificates:
 - subject: /C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/CN=Microsoft Windows UEFI Driver Publisher
   issuer:  /C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/CN=Microsoft Corporation UEFI CA 2011
 - subject: /C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/CN=Microsoft Corporation UEFI CA 2011
   issuer:  /C=US/ST=Washington/L=Redmond/O=Microsoft Corporation/CN=Microsoft Corporation Third Party Marketplace Root

或者:

# sbverify --list /boot/vmlinuz-5.7.11-amd64
signature 1
image signature issuers:
 - /CN=morfikov's kernel-signing key
image signature certificates:
 - subject: /CN=morfikov's kernel-signing key
   issuer:  /CN=morfikov's kernel-signing key

答案3

根据 Andreas 提供的信息,我得出以下结论:

在工作系统上,Grub-EFI本身Linux 内核使用相同的密钥进行签名。在非工作系统上,Grub 和 Linux 内核均未签名。当我尝试将 Linux 内核从一个系统复制到另一个系统时,Grub 抱怨该内核未签名。没有分离的 GPG 签名;看来 Grub 正在寻找与安全启动相同的东西——内部 PE 签名。

现在,如果我能弄清楚如何让 OpenSUSE 签署其 32 位版本的 Linux 内核......

相关内容