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

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

当我尝试安装像VirtualBox,Nvidia或Broadcom驱动程序这样的DKMS模块时,它们没有安装,当我尝试对它们进行modprobe时,我得到了Required key not available

VirtualBox抱怨没有加载vboxdrv

Broadcom wl驱动程序在lspci -k为内核模块但未使用。 sudo modprobe wl throws Required key not available

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

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

我该如何解决?

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

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

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

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

另一种方法是使用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受到影响。

正如用户@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 
  3. 将密钥注册到安全启动

     sudo mokutil --import MOK.der 

    提供密码以供重启后使用

  4. Reboot并按照说明注册MOK(机器所有者密钥)。 这是一个带图片的示例 。 系统将再次重启。

如果您的模块在Ubuntu 16.04上以这种方式运行(我相信内核4.4.0-21),请告诉我。

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

关于安全(额外)意识的附加说明:;-)

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

您可以使用以下步骤在BIOS中禁用安全引导(UEFI):

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

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

在华硕主板:

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

您还可以在shim-signed running sudo update-secureboot-policy禁用安全启动。 这个维基页面解释了这个方法:

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

您仍然可以再次使用填充符号启用安全启动。 只是执行

sudo update-secureboot-policy –enable然后按照上面的步骤操作