前面社区已经有两篇非常好的基础文章:
-
签名中心服务器搭建与基础 PKI/TSA/CMS 配置:
PKI 实践指南:构建完整的签名中心服务系统 x openUBMC hpm包签名实践 -
openUBMC HPM 固件包远程签名接入:
openUBMC 远程签名接入教程(SignServer + hpm_signer)
本文不再重复 SignServer 服务器搭建过程,重点只讲 CSR/PSR 出包场景下,如何让 bingo 在外层 HPM 阶段走 SignServer CMS/TSA 签名。
1. 适用范围
本文适用于以下场景:
- 使用
bingo build进行 CSR/PSR 出包 - 需要将 外层 HPM 文件清单签名 接入 SignServer
- 构建侧希望保留
hpm_verify本地验签动作 - 不改变原有 HPM 加密逻辑
注意:
- 本文只讲 外层 HPM/CMS 签名
- EEPROM/PSR 内层
.bin的 ECC 签名请看另一篇单独帖子 - 如果你的平台还要求 HPM 包加密,请继续保留原有
[hpm_encrypt]配置,这和外层签名是两件事
2. 前置条件
构建环境需要具备:
bingohpm_signerhpm_verifyopenssl- 可访问 SignServer 的网络
- 可用于构建侧验签的
rootca.der和rootca.crl
SignServer 侧需要已经准备好:
- CMS worker
- TSA worker
- 对应 HTTPS 访问能力
3. 配置入口说明
这里先强调一个容易混淆的点:
前一篇 HPM 远程签名接入文章中,示例主要是 manifest.yml 风格配置;
而 当前 CSR/PSR 出包场景下的 bingo 适配,读取的是 .bmcgo/config 体系。
当前实现支持以下三个位置:
- 当前产品/manifest 目录下的
.bmcgo/config ~/.bmcgo/config/etc/bmcgo.conf
优先级从高到低依次为:
- 当前目录
.bmcgo/config ~/.bmcgo/config/etc/bmcgo.conf
建议优先在当前产品目录下放 .bmcgo/config,这样不容易影响其他项目。
4. 外层签名配置示例
在 .bmcgo/config 中加入:
[hpm_signserver]
url = https://<SIGN_SERVER_DOMAIN>/signserver/process
tsa_url = https://<SIGN_SERVER_DOMAIN>/signserver/process?workerId=<TSA_WORKER_ID>
cms_worker_id = <CMS_WORKER_ID>
hash = SHA-256
rootca_der = /root/ca/rootca.der
rootca_crl = /root/ca/rootca.crl
curl_cafile = /root/ca/ca.pem
insecure = false
keyfactory = true
如果你需要跳过 HTTPS 校验,也可以使用:
[hpm_signserver]
url = https://<SIGN_SERVER_DOMAIN>/signserver/process
tsa_url = https://<SIGN_SERVER_DOMAIN>/signserver/process?workerId=<TSA_WORKER_ID>
cms_worker_id = <CMS_WORKER_ID>
hash = SHA-256
rootca_der = /root/ca/rootca.der
rootca_crl = /root/ca/rootca.crl
insecure = true
keyfactory = true
参数说明:
- url:CMS 签名服务地址,对应 hpm_signer -S
- tsa_url:时间戳服务地址,对应 hpm_signer -U
- cms_worker_id:CMS workerId
- hash:客户端摘要算法,默认建议 SHA-256
- rootca_der/rootca_crl:构建侧本地验签和产物回包所需材料
- curl_cafile:HTTPS CA 文件
- insecure:跳过 HTTPS 校验
- keyfactory:Keyfactor/SignServer 模式开关
说明:
- 当 insecure=true 时,curl_cafile 不再生效
- 如果同时配置了 hpm_signserver 和旧的 hpm_self_sign / hpm_server_sign,当前实现会优先走 hpm_signserver
———
5. 构建命令
常见用法:
bingo build
如果只验证单个 SR 文件,也可以直接执行:
bingo build -s -p /path/to/2U1P_PSR.sr --hpm --bin -o /tmp/out
———
6. 构建阶段发生了什么
当构建进入 HPM 外层签名阶段,流程如下:
- bingo 读取 hpm_signserver 配置
- 生成 HPM 外层 image.filelist
- 将 rootca.der/rootca.crl 转换为 PEM,供本地验签使用
- 调用 hpm_signer -S/-U 请求 SignServer 生成 *.cms
- 调用 hpm_verify 做本地验签
- 验签通过后,重新回包生成最终 HPM
这条链路本质上还是 HPM/CMS 签名,只是将签名动作从本地证书切换到了 SignServer。
———
7. 关键日志
构建成功时,通常可以看到类似日志:
hpm签名使用 remote_cms 方法
hpm_signer -i … -o … -S https://… -U https://… --cms-worker-id …
hpm_verify -r rootca.pem -C cms.crl.pem -c … -s …
构建成功!
这里最关键的是:
- hpm签名使用 remote_cms 方法
- hpm_signer … -S … -U …
- hpm_verify …
- 构建成功!
———
8. 常见问题
8.1 没有走远程签名
先看日志里是否出现:
hpm签名使用 remote_cms 方法
如果没有,优先检查:
- 当前目录是否真的命中了目标 .bmcgo/config
- 是否只配置了旧的 hpm_self_sign / hpm_server_sign
- hpm_signserver section 名称是否写错
8.2 报错 rootca.der/rootca.crl 不存在
这两个文件是构建侧必需材料,不只是“可选展示文件”。
用途有两个:
- 本地执行 hpm_verify
- 产物链路需要回包证书材料
8.3 HTTPS 校验失败
优先检查:
- 域名是否正确解析
- curl_cafile 是否可用
- 是否需要临时改为 insecure=true 进行排障
8.4 配了 SignServer 但还想保留旧方式
当前实现里,hpm_signserver 存在时优先级高于旧配置。
如果你要继续走旧链路,请去掉 hpm_signserver section,或在独立配置文件中切换使用。
———
9. 结语
这次适配的核心目标,不是再造一套新的 HPM 签名体系,而是让 CSR/PSR 出包在外层 HPM 阶段,能够平滑复用现有 SignServer CMS/TSA 能力。
如果你已经完成了签名中心搭建,那么 CSR/PSR 外层接入的关键点只有三个:
- 配置入口改为 .bmcgo/config
- 准备好 rootca.der/rootca.crl
- 使用 hpm_signserver section 让 bingo 切到 remote_cms 分支
———
参考资料
- PKI 实践指南:构建完整的签名中心服务系统 x openUBMC hpm包签名实践
PKI 实践指南:构建完整的签名中心服务系统 x openUBMC hpm包签名实践 - openUBMC 远程签名接入教程(SignServer + hpm_signer)
openUBMC 远程签名接入教程(SignServer + hpm_signer)
