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