签名的内核模块 - “未使用可信密钥签名”

签名的内核模块 - “未使用可信密钥签名”

问题:

我正在尝试使用签名的内核模块,但命令失败insmod

PKCS#7 signature not signed with a trusted key

Linux 启动期间可能会出现相关的错误消息:

[    3.342888] Loading compiled-in X.509 certificates
[    3.391774] Problem loading in-kernel X.509 certificate (-129)

该命令cat /proc/keys显示.builtin_trusted_keys: empty

设置:

4.9.x 内核是使用以下 defconfig 选项编译的:

...
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODVERSIONS=y
CONFIG_MODULE_SRCVERSION_ALL=y
CONFIG_MODULE_SIG=y
CONFIG_MODULE_SIG_ALL=y
CONFIG_MODULE_SIG_FORCE=y
CONFIG_MODULE_SIG_SHA256=y
CONFIG_MODULE_SIG_HASH="sha256"
CONFIG_SYSTEM_TRUSTED_KEYRING=y
CONFIG_KEYS_DEBUG_PROC_KEYS=y
CONFIG_PERSISTENT_KEYRINGS=y
CONFIG_ENCRYPTED_KEYS=y
CONFIG_SECURITY_DMESG_RESTRICT=y
CONFIG_SECURITY=y
CONFIG_SECURITYFS=y
CONFIG_SECURITY_PATH=y
CONFIG_HARDENED_USERCOPY=y
CONFIG_SECURITY_SMACK=y
CONFIG_SECURITY_SMACK_BRINGUP=y
CONFIG_DEFAULT_SECURITY_DAC=y
...

模块使用以下命令进行签名: sign-file sha256 certs/signing_key.pem certs/signing_key.x509 <.ko>

评论:

我假设我需要修复内核中的 X.509 证书加载错误,但我还没有遇到如何做到这一点。我认为内核编译期间生成的文件certs/signing_key.pem将被包装到内核中,但它似乎不基于/proc/keys.我不想禁用签名或允许未签名的模块,我只想使用可信密钥对它们进行正确签名。如果有人有建议,我们将不胜感激。

我发现有关 nvidia 驱动程序和 Ubuntu/Fedora 的帖子尚未取得任何进展。例子: PKCS#7 签名未使用可信密钥签名

答案1

我认为内核编译需要signing_key.* 文件位于内核源代码树的基目录中,而不是位于“certs”子目录下。编译过程应该自动为您签署标准模块;只有第三方模块需要手动签名。

另外,我用于编译带有签名模块的 4.9.* 内核的旧脚本具有 DER 格式的证书文件。也许有必要吗?

在 4.14 及更新版本的内核中,该过程有点不同:有一个内核配置选项用于指定证书文件的路径名。

答案2

@bjornruffians您可以创建自己的x509.genekey文件并在编译之前将其复制到内核源即certs/文件夹中。 警告:不要复制您的自定义/手动生成的signing_key.pem或cert文件夹中除x509.genekey之外的任何其他文件,因为内核将根据您的x509.genekey文件自动生成signing_key.x509和signing_key.pem文件。

相关内容