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

Nad*_*tai 30 dual-boot kernel

我今天用 ukuu 升级了我的内核,从那以后我无法启动,因为我收到了这个错误:

error: /boot/vmlinuz-4.18.12-041812-generic has invalid signature
error: you need to load the kernel first
Run Code Online (Sandbox Code Playgroud)

我有 Windows 10 和 ubuntu 18.10 双启动(今天升级)

更新:我设法引导到我从 grub 中的“Ubuntu 高级选项”中选择的旧内核

但是我需要升级我的内核,如果我这样做,我仍然会遇到同样的问题......

pru*_*wan 20

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

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

说明适用于 ubuntu,但如果其他发行版使用 shim 和 grub 作为引导加载程序,则它们的工作方式应该类似。如果您的发行版没有使用 shim(例如 Linux Foundation Preloader),则应该有类似的步骤来完成签名(例如 HashTool 而不是 MokUtil for LF Preloader),或者您可以安装 shim 来代替。用于 shim 的 ubuntu 包称为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"
Run Code Online (Sandbox Code Playgroud)

根据您的细节调整所有部分。

  1. 创建用于签署内核的公钥和私钥:
openssl req -config ./mokconfig.cnf \
        -new -x509 -newkey rsa:2048 \
        -nodes -days 36500 -outform DER \
        -keyout "MOK.priv" \
        -out "MOK.der"
Run Code Online (Sandbox Code Playgroud)
  1. 将密钥也转换为 PEM 格式(mokutil 需要 DER,sbsign 需要 PEM):
openssl x509 -in MOK.der -inform DER -outform PEM -out MOK.pem
Run Code Online (Sandbox Code Playgroud)
  1. 注册 shim 安装的密钥:
sudo mokutil --import MOK.der
Run Code Online (Sandbox Code Playgroud)

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

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

  2. 通过以下方式验证您的密钥已注册:

sudo mokutil --list-enrolled
Run Code Online (Sandbox Code Playgroud)
  1. 对您安装的内核进行签名(它应该在 /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
Run Code Online (Sandbox Code Playgroud)
  1. 复制未签名内核的 initram,因此我们还有一个用于签名内核的 initram。
sudo cp /boot/initrd.img-[KERNEL-VERSION]-surface-linux-surface{,.signed}
Run Code Online (Sandbox Code Playgroud)
  1. 更新您的 grub 配置
sudo update-grub
Run Code Online (Sandbox Code Playgroud)
  1. 重新启动系统并选择已签名的内核。如果启动正常,您可以删除未签名的内核:
sudo mv /boot/vmlinuz-[KERNEL-VERSION]-surface-linux-surface{.signed,}
sudo mv /boot/initrd.img-[KERNEL-VERSION]-surface-linux-surface{.signed,}
sudo update-grub
Run Code Online (Sandbox Code Playgroud)

现在你的系统应该在一个签名的内核下运行,并且升级 GRUB2 再次工作。如果您想升级自定义内核,您可以从第七步再次按照上述步骤轻松签署新版本。因此备份 MOK 密钥(MOK.der、MOK.pem、MOK.priv)。

  • Ecxellent 响应,我无法单独使用 ubuntu 说明到达那里 (2认同)
  • 使用后缀重命名和覆盖文件的绝佳快捷方式。 (2认同)
  • 很详细的回答。它在 Ubuntu 20.04 和内核 5.8 上对我很有用。 (2认同)

xjc*_*jcl 17

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

您通常可以通过在启动期间按一个特殊键来进入菜单,您可以为您的设备搜索特定的菜单,或者它甚至可能在启动期间显示在屏幕上。

  • 谢谢!我刚刚更新了 BIOS,却忘记禁用它! (2认同)