能否使用SoftHSM中的密钥签名vmlinuz内核?
可以用SoftHSM中的私钥完成内核签名,我来帮你排查并解决初始化失败的问题
首先明确:完全可以用SoftHSM存储的私钥完成vmlinuz内核的Secureboot签名,你遇到的“未完成初始化”错误,大概率是OpenSSL PKCS#11引擎配置、SoftHSM令牌状态,或者工具链交互的问题,下面一步步来解决:
1. 先确认SoftHSM令牌已正确初始化
这是最基础的前提,很多初始化失败的问题都出在这里:
- 先查看系统中的SoftHSM插槽:
softhsm2-util --show-slots - 找到未初始化的插槽(或者选择你想用的插槽),执行初始化命令(替换参数为你的信息):
softhsm2-util --init-token --slot 0 --label "SecureBoot_Signing_Token" --pin 你的用户PIN --so-pin 你的管理员PIN - 初始化后再次用
--show-slots验证,确保插槽状态显示为Initialized
2. 配置OpenSSL正确加载PKCS#11引擎
OpenSSL需要明确知道如何连接到SoftHSM的PKCS#11模块,你需要修改(或创建)OpenSSL配置文件:
- 找到你的OpenSSL配置文件位置(通常是
/etc/ssl/openssl.cnf或~/.openssl/openssl.cnf),添加以下配置段:
提示:如果找不到[engine_section] pkcs11 = pkcs11_section [pkcs11_section] engine_id = pkcs11 # 注意:下面的路径要对应你系统中实际的库文件位置 dynamic_path = /usr/lib64/engines-3/libpkcs11.so MODULE_PATH = /usr/lib64/softhsm/libsofthsm2.so PIN = 你的用户PIN init = 0libpkcs11.so,可以用find /usr -name libpkcs11.so搜索;libsofthsm2.so同理。
3. 验证OpenSSL与SoftHSM的连接
在继续签名前,先确认OpenSSL能正常访问SoftHSM中的密钥:
- 检查PKCS#11引擎是否能加载:
如果输出显示openssl engine -t -c pkcs11[ available ],说明引擎加载成功。 - 列出SoftHSM中的密钥对,确认你的签名私钥存在:
你应该能看到标注了你设置的令牌标签和密钥名称的条目。openssl pkcs11 -engine pkcs11 -keypair -list
4. 用SoftHSM密钥签名内核镜像
现在可以选择两种方式完成签名:
方式一:直接用OpenSSL签名
针对PE格式的vmlinuz,执行以下命令(替换密钥URI为你实际的密钥路径):
openssl dgst -engine pkcs11 -sign "pkcs11:token=SecureBoot_Signing_Token;object=你的签名密钥名称;type=private" -sha256 -out vmlinuz.sig vmlinuz
如果需要将签名嵌入到内核镜像中,可以用objcopy将签名添加到PE节中,或者结合sbattach工具(如果使用systemd-boot相关工具)。
方式二:用pesign配合PKCS#11引擎
如果习惯用pesign,确保你的pesign版本支持PKCS#11,然后执行:
pesign -n -i vmlinuz -o vmlinuz-signed -c "pkcs11:token=SecureBoot_Signing_Token;object=你的签名密钥名称" -k pkcs11
注意:部分版本的pesign可能需要额外配置环境变量,比如export PESIGN_ENGINE=pkcs11。
常见“未完成初始化”错误排查
如果还是遇到错误,检查以下几点:
- 路径错误:确认
openssl.cnf中的dynamic_path和MODULE_PATH完全正确,不同发行版的库路径可能不同。 - 权限问题:SoftHSM的令牌存储目录(默认
/var/lib/softhsm/tokens)需要当前用户有读写权限,必要时可以用sudo执行命令,或者修改目录权限。 - PIN错误:确保
openssl.cnf中的PIN和你初始化令牌时设置的一致,避免大小写或数字错误。 - OpenSSL版本:较旧的OpenSSL版本可能对PKCS#11支持不完善,建议使用OpenSSL 1.1.1或3.x版本。
额外注意事项
- 要让UEFI信任这个签名,你需要将SoftHSM中私钥对应的公钥导入到UEFI的**DB(签名数据库)**中,具体步骤取决于你的主板UEFI界面。
- 确保你的内核已经开启了
CONFIG_EFI_STUB配置,编译为符合Secureboot要求的PE格式镜像。
内容的提问来源于stack exchange,提问作者Ashok Vairavan
相关产品推荐
相关产品推荐

