非 UEFI 主板上的签名模块

非 UEFI 主板上的签名模块

我使用的是 Ubuntu 16.04,内核是 4.4.0-57,想安装一个自制模块。BIOS 是非 UEFI BIOS(Kontron 986LCD-M/mITX)。

我尝试按照以下步骤对模块进行签名程序但步骤3()的结果sudo mokutil --import MOK.derEFI 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 中的一个巨大错误。mokutilMokManager仅当您拥有支持 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_SIGCONFIG_MODULE_SIG_ALL应该设置为n。然而,这有一个明显的缺点,因为您必须暂停内核更新,并且必须重新编译每个新内核。这很令人沮丧。

答案2

您所参考的过程描述了禁用安全启动验证,而不是对模块进行签名。在非 UEFI 系统上无需对内核模块进行签名,因为安全启动是 UEFI 独有的功能。

也就是说,如果你确实想在非 UEFI 系统上签名内核模块,你应该能够做到这一点。(我没有尝试过,但据我所知,所有工具都是 Linux 用户空间工具,不依赖于安全启动是否可用或处于活动状态。)如果您想构建一个带有签名模块的软件包以安装在其他系统上,您可以这样做。请注意,您需要在目标系统上安装自己的密钥,这可能很繁琐;请参阅下面的指针。要签署内核模块:

  1. 创建一组签名密钥。这是一项复杂的任务。我建议你阅读我的安全启动页面有关创建签名密钥的信息。
  2. 找到sign-file二进制文件。此二进制文件通常不会安装在 Linux 二进制文件安装的位置;相反,它附带内核头文件。find /usr/src/ -name sign-file如果它安装在您的系统上,该命令应该会找到它。如果此命令未返回任何内容,则必须安装内核头文件包。
  3. 使用以下命令对二进制文件进行签名/path/to/sign-file sha256 /key/path/your.key /key/path/your.cer /path/to/module/module.ko

此时,二进制文件将使用您的密钥(和)module.ko进行签名。要使用,您的密钥必须在目标系统中注册,可能在 MOK 列表中。为此,您必须使用 进行安装,详情请参阅your.keyyour.cerMokManager.efi我的安全启动页面。

不过,我想再次强调,签署内核模块是不是除了在 UEFI 模式下启动且安全启动处于活动状态的系统外,其他系统均无需执行此操作 - 即使在这种情况下,也仅对第三方或本地编译的内核模块(如商业视频驱动程序或 VirtualBox 内核模块)才需要执行此操作。Ubuntu 内核提供的大多数内核模块都已使用与签署 GRUB 和主 Ubuntu 内核文件相同的 Canonical 密钥进行签名。

相关内容