vmlinuz-4.18.12-041812-generic 的签名无效。

我今天用ukuu升级了我的内核,自那以后我无法启动,因为我遇到了这些错误:
error: /boot/vmlinuz-4.18.12-041812-generic has invalid signature
error: you need to load the kernel first

我有双系统,Windows 10和Ubuntu 18.10(今天升级的)。
更新:我成功地从grub的“高级选项”中选择了旧内核来启动。
但是我需要升级我的内核,如果我这样做,仍然会遇到同样的问题...

我按照这个教程解决了我的问题,用于安全启动的签名/boot/vmlinuz文件。只是注意到教程的最后一部分。 - Nadav Shabtai
我现在遇到了同样的问题,这是在更新了我的联想T480固件之后出现的。我不明白为什么旧版本的内核还能正常工作。 - user205301
3个回答

https://github.com/jakeday/linux-surface/blob/master/SIGNING.md有关内核签名的更具体说明(改编自接受答案中的相同教程)。完整的说明如下:

为安全启动签名自定义内核

这些说明适用于Ubuntu,但对于使用shim和grub作为引导加载程序的其他发行版也应该类似。如果您的发行版没有使用shim(例如Linux Foundation Preloader),则应该有完成签名的类似步骤(例如使用HashTool代替LF Preloader的MokUtil),或者您可以安装shim来替代。Ubuntu的shim软件包名为shim-signed,但请确保正确安装它,以免损坏引导加载程序。

自Ubuntu最近的GRUB2更新(2.02+dfsg1-5ubuntu1)以来,只要启用了安全启动,GRUB2就不再加载未签名的内核。Ubuntu 18.04的用户在升级grub-efi软件包时会收到通知,提示该内核未经过签名,升级将中止。

因此,您有三种解决这个问题的选择:
1. 您自己签署内核。 2. 使用您发行版的已签名通用内核。 3. 禁用安全启动。
由于第二和第三个选项实际上并不可行,以下是自己签署内核的步骤。
指令改编自Ubuntu博客。在执行之前,请备份/boot/EFI目录,以便可以恢复所有内容。请自行承担风险执行以下步骤。
1. 创建用于创建签名密钥的配置文件,保存为mokconfig.cnf:
# This definition stops the following lines failing if HOME isn't
# defined.
HOME                    = .
RANDFILE                = $ENV::HOME/.rnd 
[ req ]
distinguished_name      = req_distinguished_name
x509_extensions         = v3
string_mask             = utf8only
prompt                  = no

[ req_distinguished_name ]
countryName             = <YOURcountrycode>
stateOrProvinceName     = <YOURstate>
localityName            = <YOURcity>
0.organizationName      = <YOURorganization>
commonName              = Secure Boot Signing Key
emailAddress            = <YOURemail>

[ v3 ]
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always,issuer
basicConstraints        = critical,CA:FALSE
extendedKeyUsage        = codeSigning,1.3.6.1.4.1.311.10.3.6
nsComment               = "OpenSSL Generated Certificate"

将所有带有的部分调整为您的详细信息。
2. 创建用于签署内核的公钥和私钥:
openssl req -config ./mokconfig.cnf \
        -new -x509 -newkey rsa:2048 \
        -nodes -days 36500 -outform DER \
        -keyout "MOK.priv" \
        -out "MOK.der"

将密钥也转换为PEM格式(mokutil需要DER,sbsign需要PEM)。
openssl x509 -in MOK.der -inform DER -outform PEM -out MOK.pem

4. 将密钥注册到您的垫片安装中:
sudo mokutil --import MOK.der

您将被要求输入密码,您只需在下一步中使用它来确认您的密钥选择,因此可以选择任意密码。

  1. 重新启动您的系统。您将遇到一个名为MOKManager的工具的蓝色屏幕。 选择“注册MOK”,然后选择“查看密钥” 。确保它是您在第2步创建的密钥。 之后继续过程,您必须输入您在第4步提供的密码。继续引导您的系统。

注意:如果MOKManger在重启时未加载,则请更改启动顺序。link

  1. 通过以下方式验证您的密钥已注册:
sudo mokutil --list-enrolled

签署您安装的内核(应位于 /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface):
sudo sbsign --key MOK.priv --cert MOK.pem /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface --output /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface.signed

复制未签名内核的initram,这样我们也会有一个已签名内核的initram。
sudo cp /boot/initrd.img-[KERNEL-VERSION]-surface-linux-surface{,.signed}

9. 更新你的 grub 配置文件。
sudo update-grub

重启您的系统并选择已签名的内核。如果引导成功,您可以删除未签名的内核:
sudo mv /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface{.signed,}
sudo mv /boot/initrd.img-[KERNEL-VERSION]-surface-linux-surface{.signed,}
sudo update-grub

现在您的系统应该在已签名的内核下运行,并且可以再次升级GRUB2。如果您想升级自定义内核,只需按照上述步骤从第七步开始再次签署新版本即可。请确保备份MOK密钥(MOK.der、MOK.pem、MOK.priv)。

2出色的回应,仅依靠Ubuntu的指导我可能无法达到目标。 - Preston
3重命名和覆盖文件的绝佳捷径。 - Tom
2非常详细的答案。对我来说在Ubuntu 20.04和内核5.8上运行得很好。 - Andyc
1这应该是被接受的答案。 - Saren Tasciyan
Jake Day的Linux Surface仓库不再活跃维护,此处提供的页面已经不存在。 - Sam Hobbs
附加说明:对于其他人不确定步骤7和8应该如何完成的,你可以通过ls /boot来查看内核文件夹和initram的名称,完全复制你那里的内容,并确保它是你的目标内核(如果你那里有多个内核)。 - Inovramadani
需要对内核模块进行签名吗? - Shawn Eary
SIGNING.md的旧版本:https://github.com/jakeday/linux-surface/blob/a39cc29295318894d624977a107c0999cc0ef6ac/SIGNING.md - prusswan

我没有签署有问题的内核,而是在我的笔记本电脑的BIOS/UEFI菜单中关闭了安全启动。

通常情况下,您可以通过在启动过程中按下特殊键进入菜单,您可以为您的设备搜索具体的按键或者甚至在启动过程中屏幕上显示。


2谢谢!我刚刚更新了我的BIOS,忘记把它禁用了! - Lucas Bustamante
这对我来说很有效! - Jonathan
这在Ubuntu 20.04上运行良好。 - Anirudha Mahale
幸运的是,那个答案首先来自谷歌。还有忘了关于安全引导的事情,这是在BIOS更新后发生的。这个问题虽然可怕,但有一个简单的解决方案。谢谢! - Déjà vu
谢谢。在更新 BIOS 后,我遇到了这个错误。我担心浪费时间下载 Ubuntu 镜像文件以制作 USB 启动盘。 - Edip Ahmet
太好了!这对我来说很合适。 - Abanoub Asaad
谢谢,伙计!你救了我的一天!适用于Ubuntu 20.14和内核5.16。 - IStranger
对我也起作用了! - Daniel Katz

我在今天更新后遇到了这个问题。将引导加载程序更改为shimx64.efi似乎解决了它。