openUBMC CSR/PSR 外层 HPM 签名接入教程(SignServer + bingo)

前面社区已经有两篇非常好的基础文章:

  1. 签名中心服务器搭建与基础 PKI/TSA/CMS 配置:
    PKI 实践指南:构建完整的签名中心服务系统 x openUBMC hpm包签名实践

  2. 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. 前置条件

构建环境需要具备:

  • bingo
  • hpm_signer
  • hpm_verify
  • openssl
  • 可访问 SignServer 的网络
  • 可用于构建侧验签的 rootca.der 和 rootca.crl

SignServer 侧需要已经准备好:

  • CMS worker
  • TSA worker
  • 对应 HTTPS 访问能力

3. 配置入口说明

这里先强调一个容易混淆的点:

前一篇 HPM 远程签名接入文章中,示例主要是 manifest.yml 风格配置;
而 当前 CSR/PSR 出包场景下的 bingo 适配,读取的是 .bmcgo/config 体系。

当前实现支持以下三个位置:

  1. 当前产品/manifest 目录下的 .bmcgo/config
  2. ~/.bmcgo/config
  3. /etc/bmcgo.conf

优先级从高到低依次为:

  1. 当前目录 .bmcgo/config
  2. ~/.bmcgo/config
  3. /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 外层签名阶段,流程如下:

  1. bingo 读取 hpm_signserver 配置
  2. 生成 HPM 外层 image.filelist
  3. 将 rootca.der/rootca.crl 转换为 PEM,供本地验签使用
  4. 调用 hpm_signer -S/-U 请求 SignServer 生成 *.cms
  5. 调用 hpm_verify 做本地验签
  6. 验签通过后,重新回包生成最终 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 外层接入的关键点只有三个:

  1. 配置入口改为 .bmcgo/config
  2. 准备好 rootca.der/rootca.crl
  3. 使用 hpm_signserver section 让 bingo 切到 remote_cms 分支

———

参考资料


1 个赞