为什么在安装第三方内核模块或升级内核后出现“必需密钥不可用”的信息?


79

仅在启用了安全启动的UEFI系统上会发生此问题。

当我尝试安装DKMS模块(如VirtualBox,Nvidia或Broadcom驱动程序)时,它们没有安装,Required key not available当我尝试安装它们时,我得到modprobe了。

VirtualBox抱怨vboxdrv未加载。

Broadcom wl驱动程序显示lspci -k为内核模块,但未使用。sudo modprobe wl抛出Required key not available

当我从git源安装一些内核模块时,也可能发生此问题。

内核更新为禁用的无线适配器后,重新启动后出现黑屏,可能会出现此问题。

我该如何解决?


Answers:


85

从Ubuntu内核4.4.0-20 EFI_SECURE_BOOT_SIG_ENFORCE开始,已启用内核配置。如果启用了UEFI安全启动,则可以防止加载未签名的第三方模块。

解决此问题的最简单方法是禁用 UEFI(BIOS)设置中的安全启动

在大多数情况下,您可以使用grub菜单进入UEFI设置。ESC在启动时按按钮,进入grub菜单并选择System Setup。安全启动选项应位于UEFI的“安全”或“启动”部分。

您可以直接进入UEFI,但这取决于您的硬件。阅读您的计算机手册,以了解如何到达那里。它可能是DelF2启动时或其他情况。

另一种方法是使用禁用安全启动mokutil

从Ubuntu内核版本4.4.0-21.37开始,可以通过运行来解决

sudo apt install mokutil
sudo mokutil --disable-validation

它将需要创建一个密码。密码长度至少为8个字符。重新启动后,UEFI将询问您是否要更改安全设置。选择“是”。

然后,将要求您输入先前创建的密码。某些UEFI固件不要求输入完整密码,而是要求输入完整的密码,例如1st,3rd等。请小心。有些人不明白这一点。我也没有从第一次尝试中得到它;-)

更新:现在,所有支持的Ubuntu内核都启用了此内核配置。Ubuntu 16.04、15.10和14.04受到影响。


这对我不起作用。@Sputnik的答案是。但是,我仍然想知道为什么mokutil要求我输入密码,何时需要它?
Alwin Kesler

8
@AlwinKesler要求密码,该密码在重新启动后将在实际对MOK数据库进行更改之前进行验证。否则,恶意进程可能会更改MOK数据库中的密钥,这些密钥在下次重新启动后才生效。另外,现在平台“知道”请求更改的人是重新引导后实际在场的同一个人,因此将通过硬件安全措施,例如对计算机进行物理访问并知道启动时间系统密码。
zwets

@ Pilot6:由于某些技术问题,我仍在使用Ubuntu 14.04 LTS。非常感谢您更新答案。
拉维·乔希

3
在Ubuntu 18.04上为我工作。我一辈子都无法弄清楚为什么安装nvidia驱动程序无法通过任何方式工作,甚至无法恢复到16.04。加!这样就解决了。浪费了很多时间。
Nate

1
我的Ubuntu系统真的很落后。没有意义,因为这是一台全新的笔记本电脑。现在,我意识到CPU正在执行所有操作,而我的视频卡一直处于闲置状态。此链接也有帮助-linuxbabe.com/ubuntu/install-nvidia-driver-ubuntu-18-04
Peter Drinnan

32

根据用户@zwets的建议,我在这里复制(带有编辑)答案

从内核版本4.4.0-20开始,强制执行未签名的内核模块在启用安全启动的情况下运行。如果您想保持安全启动同时运行这些模块,那么下一个逻辑步骤是对这些模块进行签名

因此,让我们尝试一下。

  1. 创建签名密钥

    openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive name/"
    
  2. 签名模块

    sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /path/to/module
    

注1:一个驱动程序/模块可以有多个文件要签名,因此/path/to/module可能需要替换为$(modinfo -n <modulename>),例如$(modinfo -n vboxdrv)

注2sudo kmodsign sha512 ./MOK.priv ./MOK.der /path/to/module如果sign-file不可用,则为替代方法。

  1. 注册密钥以安全启动

    sudo mokutil --import MOK.der
    

    提供密码以供重新启动后使用

  2. Reboot并按照说明注册MOK(机器所有者密钥)。这是带有图片的样本。系统将重新启动一次。

如果密钥已正确注册,它将显示在下sudo mokutil --list-enrolled

请让我知道您的模块是否可以在Ubuntu 16.04上以这种方式运行(我相信在内核4.4.0-21上)。

资源:有关FedoraUbuntu实现模块签名的详细网站文章。(他们一直在努力);-)

附加资源:每次virtualbox-dkms升级时,我创建了一个供自己使用的bash脚本,因此覆盖了已签名的模块。查看我vboxsign最初在GitHub上的内容

有关安全性(额外)的附加说明:;-)

由于您创建的私钥(MOK.priv在此示例中)可以由有权访问它的任何人使用,因此,确保它的安全是一种好习惯。您可以chmod对其进行加密(gpg),或将其存储在其他safe(r)中。或者,如本注释中所述,删除-nodes步骤1 中的选项。这将使用密码对密钥进行加密。


在Ubuntu 14.10上,尽管预注册了密钥并签名了驱动程序,我仍然看到“必需的密钥不可用”试图安装从源代码编译的Broadcom驱动程序。禁用验证有效。
2016年

1
这对VirtualBox和Ubuntu 16.04来说对我有用。
YtvwlD

1
我在步骤3中收到以下错误:“此系统不支持EFI变量”。“ dmesg”没有efi条目(“ dmesg | grep efi”没有结果)我还能做什么?谢谢
musbach '17

您可以将路径替换为$(modinfo -n modulename)
Shane

在此处的Ubuntu 18.04上,talpa_syscallhook.ko模块的insmod继续说“必需的密钥不可用”,尽管我已经对该模块以及Sophos AV的同一目录中的所有其他模块进行了签名,以防万一。列出所有mok密钥时,可以看到该密钥已成功注册。有关如何进行的任何想法?
Fran Marzoa

6

您可以通过以下步骤在BIOS中禁用安全启动(UEFI):

  1. 重新启动计算机并进入BIOS菜单(在我的情况下,请按F2键)

  2. 搜索安全启动并更改为旧版

在华硕主板中:

  • 转到高级模式(F7)
  • 进入“启动”部分下的“安全启动”选项
  • 用“其他操作系统”更改“ Windows UEFI模式”
  • 保存并重新启动以应用设置(F10)

2
安全启动和“传统”是不同的设置。
飞行员

但是,如果您启用了“传统启动”而不是UEFI,是否意味着未启用安全启动?
超常

@Supernormal,是的,这就是我的理解。
Sputnik

3

您还可以在匀场签名运行中禁用安全启动sudo update-secureboot-policy。此wiki页面介绍了这种方法:

  • 打开终端(Ctrl + Alt + T),然后执行sudo update-secureboot-policy,然后选择“是”。
  • 输入介于8到16位数字之间的临时密码。(例如12345678,我们稍后将使用此密码
  • 再次输入相同的密码进行确认。
  • 重新启动系统并在看到蓝屏时按任意键(MOK管理
  • 选择更改安全启动状态
  • 输入您在步骤2中选择的密码,然后按Enter。
  • 选择“是”以禁用具有Shim签名的安全启动。
  • 按Enter键完成整个过程。

您仍然可以再次启用通过Shim签名的安全启动。只需执行

sudo update-secureboot-policy --enable,然后执行上述步骤

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.