我正在运行带有安全启动的 ubuntu。当我使用从规范打包的内核时,一切工作正常。不过,我在运行自签名内核时遇到了问题。我很确定我的 MOK 密钥签名没问题(验证如下),但是当我尝试从 grub 启动内核时,在选择正确的条目后,我收到一条错误消息“正在加载...错误:坏垫片”签名。”我绞尽脑汁却找不到解决方案。为什么即使两个内核都使用 MOK 密钥进行签名,其中一个可以工作而另一个却不能?
确认:
root@T495:~# sbsign --key /var/lib/shim-signed/mok/MOK.priv --cert /var/lib/shim-signed/mok/MOK.pem /boot/vmlinuz
Image was already signed; adding additional signature
root@T495:~# sbverify --list /boot/vmlinuz
signature 1
image signature issuers:
- /C=PL/ST=Poznan/L=Poznan/O=none/CN=Secure Boot Signing/[email protected]
image signature certificates:
- subject: /C=PL/ST=yes/L=yes/O=none/CN=Secure Boot Signing/[email protected]
issuer: /C=PL/ST=yes/L=yes/O=none/CN=Secure Boot Signing/[email protected]
signature 2
image signature issuers:
- /CN=ubuntu Secure Boot Module Signature key
image signature certificates:
- subject: /CN=ubuntu Secure Boot Module Signature key
issuer: /CN=ubuntu Secure Boot Module Signature key
和
root@T495:~# openssl x509 -in /var/lib/shim-signed/mok/MOK.pem -fingerprint -noout
SHA1 Fingerprint=81:A2:93:CB:06:6F:52:BA:D9:E2:39:68:9D:FA:E2:2B:0C:95:3C:F7
root@T495:~# mokutil --list-enrolled | grep "81:a2:93"
SHA1 Fingerprint: 81:a2:93:cb:06:6f:52:ba:d9:e2:39:68:9d:fa:e2:2b:0c:95:3c:f7
我不知道发生了什么事:|
答案1
MOK.pem 在 Ubuntu/Debian 系统上生成,其扩展使用属性设置为仅支持内核模块签名。该证书不可用于根据需要对 UEFI 引导加载程序或内核进行签名以通过 shim 验证。
在shim源代码中可以看到:
#define OID_EKU_MODSIGN "1.3.6.1.4.1.2312.16.1.2"
static BOOLEAN verify_eku(UINT8 *Cert, UINTN CertSize)
{
...
x509 = d2i_X509 (NULL, &Temp, (long) CertSize);
if (x509 != NULL) {
eku = X509_get_ext_d2i(x509, NID_ext_key_usage, NULL, NULL);
if (eku) {
...
if (OBJ_cmp(module_signing, key_usage) == 0)
return FALSE;
...
}
}
return TRUE;
}
这意味着如果设置了 module_signing 扩展密钥用法,则 shim 不会认为签名证书有效,无法验证 grub 或 Linux 内核二进制文件。
创建您自己的 secureboot 签名证书(无需此类 EKU),将其注册到 mok 或 db 中,然后使用它进行签名。
参考:https://wiki.ubuntu.com/UEFI/SecureBoot/KeyManagement/KeyGeneration