module verification failed: signature and/or required key missing - tainting kernel

不同的机器编译同一个版本的内核源码生成的签名密钥 (`signing_key.pem`) 是不相同的。以下是原因和详细解释:

签名密钥 (`signing_key.pem`) 的生成过程

当你在编译内核时,默认情况下,内核编译过程会生成一个新的签名密钥对(包括 `signing_key.pem` 和 `signing_key.x509`)。这个过程使用 `openssl` 命令生成一个 RSA 私钥和相应的自签名证书。

这个过程在每次编译时都会生成一个新的密钥对,具体步骤如下:
1. 内核构建过程中,如果没有提供现有的密钥对,编译系统会调用 `certs/genkey` 脚本。
2. `genkey` 脚本会使用 `openssl` 来生成一个新的 RSA 私钥和相应的自签名证书。

由于每次生成新密钥对时,都会产生不同的 RSA 私钥和证书,因此即使是在相同版本的内核源码下,不同机器生成的签名密钥也是不同的。

如何确保密钥一致

如果你需要在不同机器上使用相同的签名密钥,可以手动生成并分发密钥对,包括将 `signing_key.pem`(私钥)和 `signing_key.x509`(公钥)分发到不同机器。同样地,在内核编译过程中,使用相同的密钥文件。

手动生成和分发签名密钥

1. 生成签名密钥对:

只需在一台机器上生成密钥对:

openssl req -new -x509 -newkey rsa:2048 -keyout signing_key.pem -out signing_key.x509 -days 365 -nodes -subj "/CN=Module Signing Key/"

2. 分发密钥对:

将生成的 `signing_key.pem`(私钥) 和 `signing_key.x509`(公钥)分发到其他需要编译内核的机器上,确保放置在内核源码的 `certs` 目录下。

3. 配置内核使用特定密钥:

在内核配置中指定使用特定的密钥:

CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"

4. 重新编译内核:

在每台机器上使用相同的密钥进行编译:

make -j$(nproc)
make modules_install
make install

通过这种方式,你可以确保在不同机器上编译的相同内核版本使用同一个签名密钥来签署模块。

 总结

不同机器编译相同版本内核源码生成的签名密钥 (`signing_key.pem`) 默认情况下是不同的。如果有需求让不同机器使用相同的签名密钥,可以手动生成密钥并在编译内核前分发和使用该密钥。

posted @ 2024-08-27 10:12  闹闹爸爸  阅读(506)  评论(0编辑  收藏  举报