如何为 grub2 构建签名的 grubx64.efi?

如何为 grub2 构建签名的 grubx64.efi?

grub-mkimage我可以在 Linux-Mint 下使用构建 64 位 efi grub2 启动文件。但我想做一个可以与签名垫片一起使用的

bootx64.efi - 签名的垫片(例如来自 Ubuntu)

grubx64.efi - grub2(例如来自 Ubuntu)

这将在安全启动模式下正常启动。但是,如果我用该grubx64.efi文件替换我构建的文件,它只能以非安全启动模式启动。

grub-mkimage脚本似乎提供了公钥。这是我需要补充的吗?如果是这样,我从哪里获取密钥以及如何添加它?

答案1

-m使用 选项可嵌入的公钥用于grub-mkimage对 GRUB 将读取的任何文件进行签名。这使用 GPG 风格的分离签名文件 ( *.sig)。但它与安全启动本身无关。

对于安全启动签名,需要不同类型的签名。安全启动兼容签名嵌入在 PE32+ 二进制文件本身中。至少有三种工具可以进行这样的签名:

您需要将垫片配置为使用 MOK(机器所有者密钥)。您可以使用 来完成此操作mokutil,或者 Debian/Ubuntu 相关发行版可能会提供更适合初学者的update-secureboot-policy脚本来完成这项工作。如果您使用它,您将在 中找到 MOK 证书(DER 格式)和相应的私钥/var/lib/shim-signed/mok

签名工具sbsignosslsigncode需要 PEM 格式的 MOK 证书。私钥已经是 PEM 格式。证书转换很简单:

sudo openssl x509 -inform DER -in /var/lib/shim-signed/mok/MOK.der -outform PEM -out ~/MOK_certificate.pem

pesign工具将需要存储在 NSS 样式证书数据库中的 MOK。您可以openssl pkcs12 -export首先将证书和私钥转换为单个 PKCS#12 文件,然后pk12util将该文件导入到新的 NSS 证书数据库目录(该目录中包含三个文件:cert8.dbkey3.dbsecmod.db)。

然后,您可以使用上述工具之一来grubx64.efi使用您的 MOK 证书及其相应的私钥进行签名:

sbsign --key <MOK private key file.pem> --cert <MOK certificate.pem> --output grubx64.efi.signed grubx64.efi
# or
pesign --in=grubx64.efi --out=grubx64.efi.signed -c <name of certificate in NSS certificate store> -n <NSS certificate store directory> -s
# or
osslsigncode -certs <MOK certificate.pem> -key <MOK private key file.pem> -h sha256 -in grubx64.efi -out grubx64.efi.signed

答案2

您需要访问嵌入到 shim 中的密钥,这很可能意味着访问构建服务(可能具有某些权限)——询问 grub 包维护者。我注意到了一些细节这里那时把所有这些都弄乱了......

相关内容