看来 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 内核......