uBMC 25.07版本编译突然就报签名异常问题,无法正常编译

问题描述

我的镜像工程前几天编译正常,今天编译突然就报签名异常的问题,这是什么原因?

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2507]

  • 硬件配置:[如 CPU、内存等]

重现步骤

这个是前几天编译正常的工程,没有做任何改动就开始报签名有问题,无法编译,重新生成了签名文件放到ca文件夹下编译也正常,但是由于更换签名需要过度包,之前交付的产品也需要维护过度包,后续版本会乱

期望结果

希望能正常使用原签名文件

答案内容由AI生成,仅供参考:
根据您描述的问题(编译突然报签名异常,原签名文件无法继续使用,而新生成的签名文件可以正常编译),结合上下文中的技术案例,可能的原因及建议如下:


可能的原因分析

  1. 签名文件后缀或配置格式变化
    上下文topic/1056(参考ID 10)中记录了完全一致的现象:

    “签名文件有后缀有变动,同时修改manifest.yml的签名文件后缀后,执行通过。”
    当前构建环境可能要求签名文件采用特定的后缀(如.der.pem.enc等),而您的旧签名文件后缀不再匹配。

  2. 签名配置结构(manifest.yml)更新
    上下文私有签名,在yml中自动化后报错(参考ID 2)指出签名配置需要从旧的signature: files格式迁移到新的signature: certificates格式。

    “不能从 yaml 文件中获取到键值 base/signature/simple_signer_server”
    如果您的manifest.yml仍使用旧格式,构建系统可能无法正确解析,导致签名异常。

  3. 构建工具版本或签名机制变更

    • topic/2908中提到“使用的还是bingo,出签名包使用bmcgo”,说明不同工具对签名的处理方式不同。
    • topic/4146(参考ID 7)指出bingo签名需要修改hpm_header.config等配置文件,否则会报gpp_header hpm错误。
      如果构建环境(如bingo版本)自动更新过,旧签名文件可能不兼容。
  4. 根证书文件新增导致签名验证失败
    openUBMC_mingtopic/204(参考ID 8)中报告26.06版本多了rsa_rootca.crtsm2_rootca.crt,按照旧方式签名会导致编译报错。您当前版本25.07可能也引入了类似变化,旧签名证书未被新构建流程认可。

  5. 签名验证开关被意外启用
    上下文work.build.conan任务失败的日志(参考ID 3)显示:

    “firmware_mgmt组件开启了签名验证,但本地无法签名”
    如果构建配置突然开启了强制签名验证,而旧签名文件对应的证书链未正确预置到rootfs中,则编译会直接失败。


基于上下文的解决建议

第一步:检查签名文件后缀与manifest.yml配置的一致性

  • 打开manifest.yml,定位signature部分,检查其格式是files还是certificates
  • 参考topic/1056的解决经验,对比ca/目录下实际签名文件的后缀名与manifest.yml中配置的后缀名,确保完全一致(例如.pem.pem.enc.der.crl等)。
  • 如果使用了certificates格式,还需确认键名是否正确(如rootca_dersigner_pemtimestamp_signer_pem)。

第二步:确认签名文件的有效性

  • 使用hpm_signerbmcgo的验证命令(如hpm_signer -s ... -t ...)验证旧签名文件是否能被当前工具正确解析。
  • 参考topic/4743(参考ID 4)中的验证命令:
    SIGN_PASSWORD=<加密密码> hpm_signer -s signer.pem.enc -t ts_signer.pem.enc -T tsa.cnf -i rootfs_BMC.img -o rootfs_BMC.img.cms
    

第三步:更新签名配置格式(如果当前版本要求新格式)

参考私有签名,在yml中自动化后报错(参考ID 2)中的正确配置示例(注意缩进和键值):

signature:
  certificates:
    rootca_der: ${product}/ca/rootca.der
    signer_pem: ${product}/ca/signer.pem
    timestamp_signer_pem: ${product}/ca/ts_signer.pem   # 根据实际文件后缀调整
    rootca_crl: ${product}/ca/rootca.crl

同时确保gpp.files中也包含了对应的证书文件。

第四步:检查根证书预置路径

  • 确认rootca.derrootca.crl已正确放入manifest/build/product/BMC/openUBMC/rootfs/目录(或根据您当前的产品目录调整),否则签名验证阶段的证书查找会失败。
  • 参考topic/4743回复:

    “需要将rootca.der文件提前预置到opt/bmc/trust/partner目录,具体实现是将rootca.der文件复制到manifest源码的build/product/BMC/openUBMC/rootfs/目录。”

第五步:区分构建工具

  • 如果您当前使用bingo,可尝试改用bmcgo执行签名出包(但需先安装对应工具,参考topic/2908的建议)。
  • 如果仍用bingo,参考topic/4146的做法,修改/usr/local/bin/下各config文件中的文件名(如将rootfs_iBMC.img改为rootfs_BMC.img),使其与manifest.yml一致。

关于过渡包与后续版本维护

您提到重新生成签名文件后可编译,但需要伴随过渡包,导致版本混乱。从上下文看,这是正常的安全流程:

  • hpm签名包升级失败(参考ID 1)明确指出:需要先刷入过渡包(包含自签名的根证书),再刷入签名包
  • 如果希望沿用旧签名文件,必须保证rootca.der已被烧录进设备的opt/bmc/trust/partner目录,且验证链无误。
  • 若旧签名文件突然不被编译环境接受,很可能是因为其证书或格式已不符合当前版本要求。安全考虑不建议强制绕过,建议接受新签名文件,并保留对应过渡包作为基线版本,后续升级包均基于该基线签名,以避免兼容性问题。

综合建议

  1. 最优先尝试:检查并修正manifest.yml中签名文件的后缀名(参考topic/1056的经验)。
  2. 排查配置格式:确认signature部分使用的是当前构建版本所需的certificates格式,而非旧版files格式(参考ID 2)。
  3. 验证证书有效性:使用上下文中的命令行工具手工验证旧签名文件是否能通过验签。
  4. 如有必要:重新生成签名证书和过渡包,并统一后续版本的签名体系。

由于您未提供具体的错误日志,以上分析基于社区中类似问题的典型模式。如果问题仍无法解决,建议查看编译过程中的详细日志(如task.log),并尝试在论坛中搜索同类错误信息。

我重新生成的签名文件名称和存放路径均和就版本的一致,manifest.yml中的内容也没有变化,可以正常编译

手动调用标红的命令,此是底层机制,如果hpm_verify失败,表示无法通过验签,可以检查crl吊销链表、证书有效期等信息。

工具源码位置:bingo/tools/src/signer/cms_ver.c-代码预览-bingo:基于命令行的 BMC 开发工程工具项目 - AtomGit
执行时可以在hpm_verify指定-v参数打印过程日志。
如有疑问,可以编译hpm_verify调试功能。

军哥好,执行了指令显示如下:

参考签名生成流程里,没有rootca.pem文件,这个需要还需要吗?我新生成的签名里编译提示正常,但也没有提示需要这个文件

检查了签名时间,也没有过期

image

请反馈hpm_verify打印日志。

检查序列号也正常,没有被吊销

image

    unsigned int flags = CMS_DETACHED | CMS_NOSMIMECAP | CMS_BINARY;
    log_debug("Open CA certificate: %s", ca_cert);
    tbio = BIO_new_file(ca_cert, "r");
    if (tbio == NULL) {
        log_error("Open CA certificate failed: %s", ca_cert);
        break;
    }

关键日志:Open CA certificate failed: xxx
请检查rootca.pem文件存在性、内容正确性等。

参考AI答复:

BIO_new_file失败,print_ssl_error返回error:80000002:systemlibrary::No such file or directory

这个错误(error:80000002:system library::No such file or directory ,在 OpenSSL 3.0+ 中对应系统的 ENOENT / 文件未找到)表明 OpenSSL 在试图打开指定路径的文件时,底层操作系统返回了“文件或目录不存在”

GitHub

BIO_new_file 是 OpenSSL 内部用来读取证书、私钥或配置文件的函数。引发此错误的排查方向如下:

排查步骤

1. 检查路径是否包含未解析的变量或空字符串

最常见的情况是配置文件中的变量未生效 ,导致实际拼出的路径出现双斜杠(如 /etc/ssl//cert.pem )或只有文件名。

GitHub

  • 排查方法: 在打印错误的地方,检查传入 BIO_new_file 或相关 SSL 初始化函数的完整字符串参数

2. 检查软链接(Symlink)是否断裂

如果加载的文件是软链接(例如 Let’s Encrypt / Certbot 证书路径 /etc/letsencrypt/live/...):

  • ls -l 查看该文件是否指向了一个已经不存在的真实路径(失效链接)。

OpenText - Forums

3. 相对路径与工作目录(CWD)问题

如果代码中写的是相对路径(如 ./cert.pemcerts/ca.crt):

  • 程序运行时的工作目录(Current Working Directory)可能与你以为的不一致(尤其是在使用 systemd 服务、Docker 容器、后台进程或脚本调用时)。
  • 解决办法: 改用绝对路径(如 /opt/app/certs/cert.pem)。

4. OpenSSL 配置文件(openssl.cnf)丢失

有时代码并没有显式加载证书,但初始化 OpenSSL 时,系统默认去找环境变量或系统路径下的 openssl.cnf,如果找不到也会报该错误。

  • 检查环境变量: 是否设置了 OPENSSL_CONF,且该环境变量指向的文件是否存在。

5. Docker 容器 / 权限环境隔离

如果程序运行在 Docker 容器或 chroot 环境中:

  • 挂载卷(Volume)路径配置有误,导致宿主机上的证书没有正确映射进容器。

代码级诊断建议 (C/C++)

如果你是在编写代码,可以在调用 BIO_new_file 之前打印当前路径和错误信息:

`C#include <stdio.h>
#include <unistd.h>
#include <openssl/bio.h>
#include <openssl/err.h>

const char *filename = “/path/to/your/certificate.pem”;

// 1. 打印当前工作目录,确认相对路径基准
char cwd[1024];
if (getcwd(cwd, sizeof(cwd)) != NULL) {
printf(“Current working dir: %s\n”, cwd);
}

// 2. 使用 C 标准库直接测试访问
if (access(filename, F_OK) != 0) {
perror(“System access check failed”); // 会直接打印系统级错误原因
}

// 3. 调用 BIO
BIO *bio = BIO_new_file(filename, “r”);
if (!bio) {
ERR_print_errors_fp(stderr);
}`

军哥好,签名生成时,参考您提供的方法:自签名CA创建以及HPM签名指导 - CICD SIG - openUBMC 论坛,里面显示rootca.pem在生成过程中已经自动删除了,一直没有这个文件,新生成的编译正常的签名也没有这个文件

军哥好,我们通过指令

openssl x509 \
-in rootca.der \
-inform DER \
-out rootca.pem \
-outform PEM

生成出了一个rootca.pem文件,手动执行标红错误指令,显示执行成功,

但是使用指令bingo build -b openUBMC -r openubmc_dev后,还是显示该错误,之后继续用手动执行也是显示正常

检查权限这些都是root权限

签名进程明确返回非零值表示执行错误,请使用产品构建匹配的证书/文件验证,另外执行完成hpm_verify后可以调用 echo $?获取命令返回状态码。

应该是执行目录不正确,应该到temp下执行相关命令,可能原因是manifest.yml copy文件出错,对比下temp/xxx/hpm_build_dir下的证书文件和ca目录下的差异

执行完返回码值是0

以下是我hpm_build_dir下的文件

这个是ca下的文件,rootca.pem最开始没有

这些是怎么比较差异?感谢

temp/log/task.log里面执行到这一段命令报的是什么错误?

日志如下:

Using configuration from /home/workspace/manifest/build/product/ca/tsa.cnf

Warning: could not open file ./serial for reading, using serial number: 1

Response has been generated.

e[32mSign /home/workspace/manifest/temp/build_openUBMC_debug_dev/output/rootfs_iBMC.img starte[m

e[32mSign /home/workspace/manifest/temp/build_openUBMC_debug_dev/output/rootfs_iBMC.img successfully(need timestamp sign more)e[m

e[32mParse cms data starte[m

e[32mFound rsaEncryption datae[m

e[32mGenerate tsa request filee[m

e[32mSigned tsa request filee[m

e[32mParse timestamp signed datae[m

e[32mMerge timestamp signed datae[m

e[32mWrite cms data to /home/workspace/manifest/temp/build_openUBMC_debug_dev/output/rootfs_iBMC.img.cms starte[m

e[32mWrite cms data to /home/workspace/manifest/temp/build_openUBMC_debug_dev/output/rootfs_iBMC.img.cms successfullye[m

e[32mFinishede[m

[2026-07-27 19:06:10,713 INFO] >> hpm_verify -r rootca.pem -C cms.crl.pem -c /home/workspace/manifest/temp/build_openUBMC_debug_dev/output/rootfs_iBMC.img -s /home/workspace/manifest/temp/build_openUBMC_debug_dev/output/rootfs_iBMC.img.cms

e[31mVerification Failuree[m

e[31merror:17000064:CMS routines::certificate verify errore[m

e[31m[2026-07-27 19:06:10,722 ERROR] 执行命令 /usr/local/bin/hpm_verify -r rootca.pem -C cms.crl.pem -c /home/workspace/manifest/temp/build_openUBMC_debug_dev/output/rootfs_iBMC.img -s /home/workspace/manifest/temp/build_openUBMC_debug_dev/output/rootfs_iBMC.img.cms 错误, 日志: /home/workspace/manifest/temp/log/task.loge[0m

前面应该还有2句命令

openssl x509

openssl crl 相关的 ,麻烦提供

[2026-07-27 19:06:09,883 INFO] 切换工作目录到: /home/workspace/manifest/temp/build_openUBMC_debug_dev

[2026-07-27 19:06:09,884 INFO] >> cp /home/workspace/manifest/temp/board_openUBMC/update_ext4.cfg /home/workspace/manifest/temp/build_openUBMC_debug_dev/hpm_build_dir/update.cfg

[2026-07-27 19:06:09,887 INFO] 切换工作目录到: /tmp/tmpl02ftawc

[2026-07-27 19:06:09,889 INFO] >> openssl x509 -in /home/workspace/manifest/build/product/ca/rootca.der -inform der -outform pem -out rootca.pem

[2026-07-27 19:06:09,890 INFO] 切换工作目录到: /home/workspace/manifest/temp/build_openUBMC_debug_dev/hpm_build_dir

[2026-07-27 19:06:09,893 INFO] >>>>>>>>>> 开始执行 /home/workspace/manifest/temp/build_openUBMC_debug_dev/conan_install/product_mgmt/include/customization.py post_hpm 定制化

[2026-07-27 19:06:09,893 INFO] 执行脚本 product_mgmt/include/customization.py 开始

[2026-07-27 19:06:09,894 INFO] >>>>>>>>>> 开始执行 /home/workspace/manifest/temp/build_openUBMC_debug_dev/conan_install/secbox/include/customization.py post_hpm 定制化

[2026-07-27 19:06:09,895 INFO] 执行脚本 secbox/include/customization.py 开始

[2026-07-27 19:06:09,895 INFO] >>>>>>>>>> 开始执行 /home/workspace/manifest/temp/build_openUBMC_debug_dev/conan_install/iam/include/customization.py post_hpm 定制化

[2026-07-27 19:06:09,895 INFO] 执行脚本 iam/include/customization.py 开始

[2026-07-27 19:06:09,896 INFO] >>>>>>>>>> 开始执行 /home/workspace/manifest/temp/build_openUBMC_debug_dev/conan_install/mdbctl/include/customization.py post_hpm 定制化

[2026-07-27 19:06:09,896 INFO] 执行脚本 mdbctl/include/customization.py 开始

[2026-07-27 19:06:09,897 INFO] >>>>>>>>>> 开始执行 /home/workspace/manifest/temp/build_openUBMC_debug_dev/conan_install/rootfs_user/include/customization.py post_hpm 定制化

[2026-07-27 19:06:09,897 INFO] 执行脚本 rootfs_user/include/customization.py 开始

[2026-07-27 19:06:09,897 INFO] >>>>>>>>>> 开始执行 /home/workspace/manifest/temp/build_openUBMC_debug_dev/conan_install/bmc_network/include/customization.py post_hpm 定制化

[2026-07-27 19:06:09,898 INFO] 执行脚本 bmc_network/include/customization.py 开始

[2026-07-27 19:06:09,899 INFO] >>>>>>>>>> 开始执行 /home/workspace/manifest/temp/build_openUBMC_debug_dev/conan_install/nsm/include/customization.py post_hpm 定制化

[2026-07-27 19:06:09,899 INFO] 执行脚本 nsm/include/customization.py 开始

[2026-07-27 19:06:09,900 INFO] >>>>>>>>>> 开始执行 /home/workspace/manifest/temp/build_openUBMC_debug_dev/conan_install/hica/include/customization.py post_hpm 定制化

[2026-07-27 19:06:09,900 INFO] 执行脚本 hica/include/customization.py 开始

[2026-07-27 19:06:09,901 INFO] >>>>>>>>>> 开始执行 /home/workspace/manifest/temp/build_openUBMC_debug_dev/conan_install/file_transfer/include/customization.py post_hpm 定制化

[2026-07-27 19:06:09,901 INFO] 执行脚本 file_transfer/include/customization.py 开始

[2026-07-27 19:06:09,901 INFO] >>>>>>>>>> 开始执行 /home/workspace/manifest/temp/build_openUBMC_debug_dev/conan_install/bmc_health/include/customization.py post_hpm 定制化

[2026-07-27 19:06:09,902 INFO] 执行脚本 bmc_health/include/customization.py 开始

[2026-07-27 19:06:09,902 INFO] >>>>>>>>>> 开始执行 /home/workspace/manifest/temp/build_openUBMC_debug_dev/conan_install/oms/include/customization.py post_hpm 定制化

[2026-07-27 19:06:09,902 INFO] 执行脚本 oms/include/customization.py 开始

[2026-07-27 19:06:09,903 INFO] >>>>>>>>>> 开始执行 /home/workspace/manifest/temp/build_openUBMC_debug_dev/conan_install/ddns/include/customization.py post_hpm 定制化

[2026-07-27 19:06:09,903 INFO] 执行脚本 ddns/include/customization.py 开始

[2026-07-27 19:06:09,904 INFO] >>>>>>>>>> 开始执行 /home/workspace/manifest/temp/build_openUBMC_debug_dev/conan_install/ssdp/include/customization.py post_hpm 定制化

[2026-07-27 19:06:09,904 INFO] 执行脚本 ssdp/include/customization.py 开始

[2026-07-27 19:06:09,904 INFO] >>>>>>>>>> 开始执行 /home/workspace/manifest/temp/build_openUBMC_debug_dev/conan_install/bmc_time/include/customization.py post_hpm 定制化

[2026-07-27 19:06:09,905 INFO] 执行脚本 bmc_time/include/customization.py 开始

[2026-07-27 19:06:09,924 INFO] bmc 版本: 25.07.01.01

[2026-07-27 19:06:09,925 INFO] >> sed -i “/^Version=/s/1.0/25.07.01.01/g” update.cfg

[2026-07-27 19:06:09,925 INFO] >> openssl crl -in /home/workspace/manifest/build/product/ca/rootca.crl -inform der -outform pem -out cms.crl.pem

[2026-07-27 19:06:09,930 INFO] >> chmod +x . -R

[2026-07-27 19:06:09,937 INFO] >> hpm_signer -s /home/workspace/manifest/build/product/ca/signer.pem -t /home/workspace/manifest/build/product/ca/ts_signer.pem -T /home/workspace/manifest/build/product/ca/tsa.cnf -i /home/workspace/manifest/temp/build_openUBMC_debug_dev/output/rootfs_iBMC.img -o /home/workspace/manifest/temp/build_openUBMC_debug_dev/output/rootfs_iBMC.img.cms

[2026-07-27 19:06:09,943 INFO] 切换工作目录到: /home/workspace/manifest/temp/build_openUBMC_debug_dev/output

[2026-07-27 19:06:09,944 INFO] >> tar --format=gnu --exclude iBMC_rootfs.tar.gz -czf rootfs_iBMC.tar.gz rootfs_iBMC.img

Using configuration from /usr/lib/ssl/openssl.cnf

Using configuration from /home/workspace/manifest/build/product/ca/tsa.cnf

Warning: could not open file ./serial for reading, using serial number: 1

Response has been generated.

不好意思,没提供全