固件签名问题

答案内容由AI生成,仅供参考:

总结

您遇到的问题核心在于:

  1. 证书/私钥格式不正确或未解密
  2. manifest.yml缺少必要签名配置项
  3. 构建系统未能正确处理加密私钥

建议操作顺序:

  1. :white_check_mark: 将所有证书转换为标准PEM格式
  2. :white_check_mark: 解密.enc私钥供构建使用
  3. :white_check_mark: 修改manifest.yml使用相对路径并补全配置
  4. :white_check_mark: 使用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/certificates
    • base/signature/hpm_digest
    • base/signature/simple_signer_server
  • 日志显示:
    不能从 yaml 文件中获取到键值 base/signature/hpm_digest, 没有相关配置
    
    表明关键配置缺失,导致签名流程不完整。

解决方案

:white_check_mark: 步骤一:确保证书和私钥为正确的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

:warning: 注意:不要在版本控制系统中提交明文私钥。建议在CI环境中临时解密。


:white_check_mark: 步骤二:正确配置 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  # 本地签名

:locked_with_key: 注意:若仍需加密私钥,请确保构建系统能自动解密,或使用签名服务。


:white_check_mark: 步骤三:验证签名脚本是否支持加密私钥

如果必须使用.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 自动完成解密+签名。


:white_check_mark: 步骤四:参考标准签名流程

根据知识库中的成功流程(见文档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签名,需重新签名以兼容。

总结

您遇到的问题核心在于:

  1. 证书/私钥格式不正确或未解密
  2. manifest.yml缺少必要签名配置项
  3. 构建系统未能正确处理加密私钥

建议操作顺序:

  1. :white_check_mark: 将所有证书转换为标准PEM格式
  2. :white_check_mark: 解密.enc私钥供构建使用
  3. :white_check_mark: 修改manifest.yml使用相对路径并补全配置
  4. :white_check_mark: 使用VERBOSE=ON重新构建,观察日志

完成后即可成功生成可升级的签名固件包,实现openUBMC平台下的自定义固件更新能力。

相关链接:

  1. 伙伴openubmc版本如何支持升级华为签名固件版本和伙伴自己签名的固件版本均能成功?
  2. OpenUBMC2506 BMC固件升级失败
  3. 无签名UBMC上无法继续更新BMC固件
  4. 基础通用问题FAQ
  5. 构建工程 | 文档中心 | openUBMC