3.11. 使用私钥签名内核模块
如果启用了 UEFI 安全引导机制,您可以通过加载签名的内核模块来提高系统的安全性。
在禁用了 UEFI 安全引导的系统上或非 UEFI 系统上,您签名的内核模块也是可以加载的。因此,您不需要提供内核模块的签名和未签名版本。
先决条件
- 您已生成了一个公钥和私钥对,并了解公钥的有效日期。详情请参阅生成公钥和私钥对。
- 您已在目标系统上注册了公钥。详情请查看在 MOK 列表中添加公钥在目标系统中注册公钥。
- 您有一个可以签注的 ELF 镜像格式的内核模块。
流程
将您的公钥导出到
sb_cert.cer
文件中:# certutil -d /etc/pki/pesign \ -n 'Custom Secure Boot key' \ -Lr \ > sb_cert.cer
从 NSS 数据库中提取密钥作为 PKCS #12 文件:
# pk12util -o sb_cert.p12 \ -n 'Custom Secure Boot key' \ -d /etc/pki/pesign
- 当上一命令提示您时,输入加密了私钥的新密码。
导出未加密的私钥:
# openssl pkcs12 \ -in sb_cert.p12 \ -out sb_cert.priv \ -nocerts \ -nodes
重要请谨慎处理未加密的私钥。
为内核模块签名。以下命令将签名直接附加到内核模块文件中的 ELF 镜像中:
# /usr/src/kernels/$(uname -r)/scripts/sign-file \ sha256 \ sb_cert.priv \ sb_cert.cer \ my_module.ko
您的内核模块现在可以被加载。
在 RHEL 8 中,密钥对的有效性日期非常重要。这个密钥没有过期,但必须在其签名密钥的有效周期内对内核模块进行签名。sign-file
实用程序不会提醒您这样做。例如:一个只在 2019 年有效的密钥可用来验证在 2019 年中使用该密钥签名的内核模块。但是,用户无法使用这个密钥在 2020 年签注一个内核模块。
验证
显示关于内核模块签名的信息:
# modinfo my_module.ko | grep signer signer: Your Name Key
检查签名中是否列出了您在生成过程中输入的名称。
注意附加的签名不包含在 ELF 镜像部分,不是 ELF 镜像的一个正式部分。因此,
readelf
等工具无法在内核模块上显示签名。载入模块:
# insmod my_module.ko
删除(未加载)模块:
# modprobe -r my_module.ko
其它资源