答案内容由AI生成,仅供参考:
总结
您遇到的问题核心在于:
- 证书/私钥格式不正确或未解密
manifest.yml缺少必要签名配置项- 构建系统未能正确处理加密私钥
建议操作顺序:
将所有证书转换为标准PEM格式
解密.enc私钥供构建使用
修改manifest.yml使用相对路径并补全配置
使用VERBOSE=ON重新构建,观察日志
完成后即可成功生成可升级的签名固件包,实现openUBMC平台下的自定义固件更新能力。
点击此处查看详细分析解答
固件签名问题分析与解决方案
问题概述
在将iBMC升级为openUBMC后,尝试通过修改manifest.yml文件配置自定义签名证书以支持固件更新,但在编译过程中出现签名错误。尽管已提供rootca.der文件并制作了过渡包成功升级到openUBMC,但当添加签名配置后,构建过程失败,无法生成可更新的固件。
错误详情
错误日志关键信息
Error Signing Data:
error:0480006C:PEM routines::no start line
此错误出现在执行hpm_signer命令时:
hpm_signer -s /home/liujinlong/rootca/rootca/signer.pem.enc -t /home/liujinlong/rootca/rootca/ts_signer.pem.enc -T /home/liujinlong/rootca/rootca/tsa.cnf -i rootfs_BMC.img -o rootfs_BMC.img.cms
错误代码error:0480006C:PEM routines::no start line表明OpenSSL无法识别输入的PEM格式文件,通常是因为文件不是有效的PEM编码(如实际为DER格式却以.pem命名),或文件内容损坏、加密未正确处理。
原因分析
根据上下文信息和错误日志,问题原因如下:
1. 证书/私钥文件格式不匹配
- 虽然配置中使用了
.pem扩展名,但这些文件可能是DER格式或加密的PEM文件。 - OpenSSL的
PEM routines期望文件以-----BEGIN CERTIFICATE-----等标头开始,而DER是二进制格式,无此标头。 - 即使是
.pem.enc加密文件,也必须先解密才能被hpm_signer使用,而当前流程未包含解密步骤。
2. 签名私钥未解密或密码未传递
signer.pem.enc表示该私钥是加密的,需提供密码才能使用。hpm_signer工具本身不支持直接读取加密的私钥,必须事先用openssl解密,或在调用时通过环境变量/参数传入密码。- 用户尝试使用
SIGN_PASSWORD=xxxx bingo build,但该环境变量可能未被底层签名脚本(如hpm_signer)正确识别或传递。
3. 配置路径与安全合规性问题
- 配置文件
manifest.yml中的证书路径为绝对路径(如/home/liujinlong/...),这在CI/CD环境中可能导致权限或访问问题。 - 正确做法应将证书放入项目指定目录(如
build/product/ca/),并在manifest.yml中使用相对路径引用。
4. 签名流程配置缺失
- 根据文档和日志分析,完整的HPM签名流程依赖多个配置项,包括:
base/signature/certificatesbase/signature/hpm_digestbase/signature/simple_signer_server
- 日志显示:
表明关键配置缺失,导致签名流程不完整。不能从 yaml 文件中获取到键值 base/signature/hpm_digest, 没有相关配置
解决方案
步骤一:确保证书和私钥为正确的PEM格式
1. 转换DER为PEM(如有必要)
# 将 DER 格式的证书转换为 PEM
openssl x509 -in rootca.der -inform der -out rootca.pem -outform pem
# 检查内容是否包含 BEGIN 语句
cat rootca.pem
# 输出应类似:
# -----BEGIN CERTIFICATE-----
# MIIDnzCCAoegAwIBAgIJAM...
# -----END CERTIFICATE-----
2. 解密加密的私钥
# 解密 signer.pem.enc
openssl rsa -in signer.pem.enc -out signer.pem -passin pass:your_password
# 或交互式输入密码
openssl rsa -in signer.pem.enc -out signer.pem
注意:不要在版本控制系统中提交明文私钥。建议在CI环境中临时解密。
步骤二:正确配置 manifest.yml
将证书文件复制到项目标准路径(避免绝对路径):
# 推荐路径
cp rootca.pem workspace/manifest/build/product/ca/
cp signer.pem workspace/manifest/build/product/ca/
cp ts_signer.pem workspace/manifest/build/product/ca/
cp tsa.cnf workspace/manifest/build/product/ca/
cp rootca.crl workspace/manifest/build/product/ca/
更新 manifest.yml 配置:
signature:
certificates:
rootca_der: build/product/ca/rootca.pem
signer_pem: build/product/ca/signer.pem
timestamp_signer_pem: build/product/ca/ts_signer.pem
timestamp_signer_cnf: build/product/ca/tsa.cnf
rootca_crl: build/product/ca/rootca.crl
hpm_digest: true # 启用摘要签名
simple_signer_server: false # 本地签名
注意:若仍需加密私钥,请确保构建系统能自动解密,或使用签名服务。
步骤三:验证签名脚本是否支持加密私钥
如果必须使用.enc文件,需确认签名脚本是否处理密码。
例如,手动测试签名命令:
# 先解密(脚本化)
echo "YourPassword" | openssl rsa -in signer.pem.enc -out signer.pem -passin stdin
# 再签名
hpm_signer -s signer.pem -t ts_signer.pem -T tsa.cnf -i rootfs_BMC.img -o rootfs_BMC.img.cms
可编写包装脚本 cms_sign_hpm.sh 自动完成解密+签名。
步骤四:参考标准签名流程
根据知识库中的成功流程(见文档chunk 1):
# 步骤1:转换DER证书为PEM
openssl x509 -in rootca.der -inform der -out rootca.pem
# 步骤2:生成CRL的PEM格式
openssl crl -in rootca.crl -inform der -out cms.crl.pem
# 步骤3:签名 filelist
hpm_signer -s signer.pem -t ts_signer.pem -T tsa.cnf -i rootfs_openUBMC.filelist -o rootfs_openUBMC.filelist.cms
# 步骤4:验证签名
hpm_verify -r rootca.pem -C cms.crl.pem -c rootfs_openUBMC.filelist -s rootfs_openUBMC.filelist.cms
# 步骤5:签名HPM包
cms_sign_hpm.sh 2 rootfs_openUBMC.hpm
确保你的流程与上述一致。
推荐最佳实践
| 项目 | 建议 |
|---|---|
| 证书管理 | 使用相对路径,放在build/product/ca/目录下 |
| 私钥安全 | 加密存储,CI中临时解密,勿提交明文 |
| 签名方式 | 优先使用签名服务(如Conan签名服务器)而非本地私钥 |
| 配置完整性 | 确保base/signature/hpm_digest等配置存在 |
| 调试方法 | 启用VERBOSE=ON,查看详细日志 |
相关知识支持
- Invalid Upgrade Package 错误常由签名证书不匹配引起,openUBMC严格校验签名链。
Xuhaijun指出,不同填充模式(PKCS#1 v1.5 vs PSS)会导致验签失败,需统一签名标准。Huawei Signature Firmware使用PSS模式证书,若伙伴使用PKCS#1 v1.5签名,需重新签名以兼容。
总结
您遇到的问题核心在于:
- 证书/私钥格式不正确或未解密
manifest.yml缺少必要签名配置项- 构建系统未能正确处理加密私钥
建议操作顺序:
将所有证书转换为标准PEM格式
解密.enc私钥供构建使用
修改manifest.yml使用相对路径并补全配置
使用VERBOSE=ON重新构建,观察日志
完成后即可成功生成可升级的签名固件包,实现openUBMC平台下的自定义固件更新能力。
相关链接: