我是否需要物理智能卡及其读卡器设备来签署 Linux 内核模块?

我是否需要物理智能卡及其读卡器设备来签署 Linux 内核模块?

我为了好玩而构建并测试了一个 Linux 内核源代码(滚动稳定),这些天,我想用自己创建的密钥签署一个内核模块,然后我在 OpenSSL 上得到了 PKCS#11 引擎用于对其进行签名。

但是存在 OpenSSL 无法请求密钥/证书的问题。所以我用 确认pkcs11-tool,但结果是“没有插槽”。

这是否意味着我应该有智能卡涉及的插槽?否则,如何签署内核模块?

以下为openssl.cnf消化内容

# referenced from the [provider_sect] below.
# Refer to the OpenSSL security policy for more information.
# .include fipsmodule.cnf

[openssl_init]
providers = provider_sect
ssl_conf = ssl_sect
engines = engine_section

[engine_section]
pkcs11 = pkcs11_section

[pkcs11_section]
engine_id = pkcs11
dynamic_path = /usr/lib/x86_64-linux-gnu/engines-3/pkcs11.so
MODULE_PATH = /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
init = 0

# List of providers to load
[provider_sect]

我尝试用谷歌搜索一天,但我只找到了有关企业、云的信息……;没有用。

答案1

scriptsLinux内核源码包的子目录中,有一个sign-file工具(以前是脚本,现在是二进制工具,与内核一起构建)。

例子:linux-6.6.13/scripts/sign-file

您可以使用它来签署内核模块:

/path/to/linux-6.6.13/scripts/sign-file sha256 private-key.pem certificate.der kernelmodule.ko

或者,如果您在 PEM 格式的单个文件中同时拥有私钥和证书,则可以设置内核配置选项CONFIG_MODULE_SIG_KEY(在配置菜单中)加密 API -> 用于签名检查的证书 -> 模块签名密钥的文件名或 PKCS#11 URI)指向该文件,并设置CONFIG_MODULE_SIG_ALL=y(在配置菜单中启用可加载模块支持 -> 自动签署所有模块),然后内核构建过程将使用您选择的密钥自动签署该内核构建中的所有模块。

您可以使用以下命令创建合适的密钥和证书文件:

openssl req -new -nodes -utf8 -sha256 -days 36500 -batch -x509 \
   -config x509.genkey -outform PEM -out kernel_key.pem \
   -keyout kernel_key.pem

如果您也想使用该sign-file工具,可以使用以下命令将证书部分转换为 DER 格式:

openssl x509 -in kernel_key.pem -out certificate.der -outform DER

内核源码包中的Documentation/admin-guide/module-signing.rst更多细节。

内核模块签名不需要使用 PKCS#11(以及扩展的智能卡或其他硬件安全模块)。

但是,如果您创建自己的 Linux 发行版并开始在全球范围内大量发布它,那么使用 PKCS#11 安全模块来保存您的发行签名密钥以提高安全性将是一个不错的选择。非常好的主意。

相关内容