我使用的是 Ubuntu 16.04,内核是 4.4.0-57,想安装一个自制模块。BIOS 是非 UEFI BIOS(Kontron 986LCD-M/mITX)。
我尝试按照以下步骤对模块进行签名程序但步骤3()的结果sudo mokutil --import MOK.der
是EFI variables are not supported on this system
。
我尝试遵循这个食谱但我找不到公钥。
如何在非 UEFI 主板上签名模块?
====================================================
更新 1:这似乎是一个童话,只有使用 UEFI Bios 运行的模块才必须使用 16.04 下的签名模块:
I use as grub option: `GRUB_CMDLINE_LINUX=" acpi_enforce_resources=lax"`.
I get the error `module verification failed: signature and/or required key missing - tainting kernel` in dmesg if I try to load a module via modprobe.
`sudo mokutil --disable-validation` returns the error `EFI variables are not supported on this system`
================= 更新 1 ====================================================
很抱歉,但这种说法是错误的:
您所参考的过程描述了禁用安全启动验证,而不是对模块进行签名。在非 UEFI 系统上无需对内核模块进行签名,因为安全启动是 UEFI 独有的功能。
内核应该以这种方式工作,但事实并非如此。我遇到这种情况是因为我总是收到错误消息,我error module verification failed: signature and/or required key missing - tainting kernel
在 dmesg 中收到错误消息,内核未加载。
================ 更新 2 ===================================================== 如何在非 uefi 主板上安装 shim:
# aptitude search shim
p grub-splashimages - a collection of great GRUB splashimages
p grub2-splashimages - a collection of great GRUB2 splashimages
p libjs-es5-shim - ECMAScript 5 compat. shims for old JavaScript engines (library
p libjs-es6-shim - ECMAScript 6 compat. shims for legacy JavaScript engines (libr
p node-es5-shim - ECMAScript 5 compat. shims for old JavaScript engines (Node.js
p node-es6-shim - ECMAScript 6 compat. shims for legacy JavaScript engines (Node
p olpc-kbdshim - Dienst zur OLPC-XO-Tastaturunterstützung
v olpc-kbdshim-common -
v olpc-kdbshim-hal -
p ruby-launchy-shim - helper class for launching a web browser
p shimmer-themes - Gtk+ themes from Shimmer Project
p shimmer-wallpapers - Wallpapers from Shimmer Project
p systemd-shim - shim für systemd
p yoshimi - Software-Synthesizer, basiert auf ZynAddSubFX
p yoshimi-data - Voreinstellungen für Yoshimi
正确吗systemd-shim
?我认为它不会起作用,因为它是非 uefi MB...
答案1
这是 Ubuntu 中的一个巨大错误。mokutil
和MokManager
仅当您拥有支持 uefi 的 MB 时才可以签署您自己的模块。 Ubuntu 16.04 下不支持 uefi 的旧 MB 无法使用 和 签署模块mokutil
。您总是会得到类似 或 的MokManager
响应。EFI variables are not supported on this system
据称内核只是为 uefi MB 启用了签名。很抱歉,但这是错误的。例如,这些内核参数也显示了这一点:
CONFIG_MODULE_SIG=y
CONFIG_MODULE_SIG_ALL=y
CONFIG_MODULE_SIG_UEFI=y
CONFIG_MODULE_SIG_SHA512=y
CONFIG_MODULE_SIG_HASH="sha512"
CONFIG_EFI_SECURE_BOOT_SIG_ENFORCE=y
CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
CONFIG_CHECK_SIGNATURE=y
CONFIG_SIGNATURE=y
正如我所说,这是非 uefi MB 的内核参数,没有意义,尤其是CONFIG_MODULE_SIG_UEFI=y
。
您必须重新编译内核并关闭签名选项。它们可以通过 找到grep -v ^# /boot/config-$(uname -r) | grep _SIG
。特别是CONFIG_MODULE_SIG
和CONFIG_MODULE_SIG_ALL
应该设置为n
。然而,这有一个明显的缺点,因为您必须暂停内核更新,并且必须重新编译每个新内核。这很令人沮丧。
答案2
您所参考的过程描述了禁用安全启动验证,而不是对模块进行签名。在非 UEFI 系统上无需对内核模块进行签名,因为安全启动是 UEFI 独有的功能。
也就是说,如果你确实想在非 UEFI 系统上签名内核模块,你应该能够做到这一点。(我没有尝试过,但据我所知,所有工具都是 Linux 用户空间工具,不依赖于安全启动是否可用或处于活动状态。)如果您想构建一个带有签名模块的软件包以安装在其他系统上,您可以这样做。请注意,您需要在目标系统上安装自己的密钥,这可能很繁琐;请参阅下面的指针。要签署内核模块:
- 创建一组签名密钥。这是一项复杂的任务。我建议你阅读我的安全启动页面有关创建签名密钥的信息。
- 找到
sign-file
二进制文件。此二进制文件通常不会安装在 Linux 二进制文件安装的位置;相反,它附带内核头文件。find /usr/src/ -name sign-file
如果它安装在您的系统上,该命令应该会找到它。如果此命令未返回任何内容,则必须安装内核头文件包。 - 使用以下命令对二进制文件进行签名
/path/to/sign-file sha256 /key/path/your.key /key/path/your.cer /path/to/module/module.ko
此时,二进制文件将使用您的密钥(和)module.ko
进行签名。要使用,您的密钥必须在目标系统中注册,可能在 MOK 列表中。为此,您必须使用 进行安装,详情请参阅your.key
your.cer
MokManager.efi
我的安全启动页面。
不过,我想再次强调,签署内核模块是不是除了在 UEFI 模式下启动且安全启动处于活动状态的系统外,其他系统均无需执行此操作 - 即使在这种情况下,也仅对第三方或本地编译的内核模块(如商业视频驱动程序或 VirtualBox 内核模块)才需要执行此操作。Ubuntu 内核提供的大多数内核模块都已使用与签署 GRUB 和主 Ubuntu 内核文件相同的 Canonical 密钥进行签名。