openUBMC 远程签名接入教程(SignServer + hpm_signer)

openUBMC 远程签名接入实践(SignServer + hpm_signer)

这篇帖子记录我在 openUBMC 构建链路里接入远程签名(Keyfactor/SignServer)的完整使用方法。目标不是讲“签名服务器怎么搭”,而是讲构建侧怎么正确、稳定、可维护地用起来

签名服务器的部署与基础配置我单独写了另一篇,这里就不重复:

《签名中心服务器搭建与配置》(链接见: PKI 实践指南:构建完整的签名中心服务系统 x openUBMC hpm包签名实践


前置条件

构建环境需要有:

  • hpm_signer

  • hpm_verify

  • openssl

  • 能访问签名服务的网络

正常通过manifest 一键式构建即可,剩下只需要搭建好的签名服务,以及服务里面启动的cms worker和时间戳worker


域名与 TLS 准备

很多内网 SignServer 的证书会要求必须用域名校验(CN/SAN)。 如果你没有内网 DNS,可以先用 hosts 解决。

1) hosts 映射

 sudo vi /etc/hosts

添加:

 <SIGN_SERVER_IP>  <SIGN_SERVER_DOMAIN>

验证:

 getent hosts <SIGN_SERVER_DOMAIN>

配图:


2) 获取 HTTPS 校验用 CA(可选但推荐)

如果平台能提供官方 CA,请优先使用平台下发版本。 没有的话可以临时抓取证书链作为 --curl-cafile 的来源:

 sudo mkdir -p /root/ca
 ​
 sudo openssl s_client -showcerts \
   -connect <SIGN_SERVER_IP>:<PORT> \
   -servername <SIGN_SERVER_DOMAIN> \
   </dev/null 2>/dev/null \
   | sed -ne '/BEGIN CERTIFICATE/,/END CERTIFICATE/p' \
   > /root/ca/ca.pem

#openssl s_client -showcerts   -connect 192.168.13.118:443   -servername 192.168.13.118   </dev/null 2>/dev/null   | sed -ne '/BEGIN CERTIFICATE/,/END CE
RTIFICATE/p'   > /root/ca/ca.pem

验证:

 curl --cacert /root/ca/ca.pem -I https://<SIGN_SERVER_DOMAIN>/

配图:


manifest 配置(核心)

manifest.yml 中加入:

 base:
   signature:
     signserver:
       # CMS 签名服务地址(对应 hpm_signer -S)
       url: "https://<SIGN_SERVER_DOMAIN>/<SIGNSERVER_API_PATH>"
 ​
       # TSA 时间戳服务地址(对应 hpm_signer -U)
       tsa_url: "https://<SIGN_SERVER_DOMAIN>/<TSA_API_PATH>"
 ​
       # SignServer CMS workerId
       cms_worker_id: <CMS_WORKER_ID>
 ​
       # 客户端摘要算法
       hash: "SHA-256"
 ​
       # 构建侧验签与产物输出所需材料
       rootca_der: "/root/ca/rootca.der"
       rootca_crl: "/root/ca/rootca.crl"
 ​
       # TLS 校验策略 signserver的ca证书
       insecure: false
       curl_cafile: "/root/ca/ca.pem"
 ​
       # Keyfactor 客户端模式(必选)
       keyfactory: true

配图:


参数速查(对照 hpm_signer)

  • url-S

  • tsa_url-U

  • cms_worker_id--cms-worker-id

  • hash--cms-client-hash

  • keyfactory--keyfactory

  • rootca_der/rootca_crl → 构建侧本地验签 + 输出给上层流程

  • insecure/curl_cafile → HTTPS 校验策略


TLS 优先级说明

当同时配置:

 insecure: true
 curl_cafile: "/root/ca/ca.pem"

行为是:

  • 优先 --insecure

  • curl_cafile 只在 insecure=false 时生效

这避免了“看起来配了安全校验但实际上被 insecure 覆盖”的误解。


构建阶段发生了什么

当构建进入签名阶段:

  1. 读取 base.signature.signserver

  2. rootca.der/rootca.crl 转 PEM(仅用于本地验签)

  3. 调用 hpm_signer 生成 *.cms

  4. 调用 hpm_verify 做构建侧验签

  5. 输出 rootca.der/rootca.crl 到上层需要的位置


常见问题

1) 报错:未找到 signserver 配置

检查路径:

 base:
   signature:
     signserver:

2) 报错:rootca.der/rootca.crl 不存在

这两个文件是构建侧必需

  • 用于本地验签

  • 用于产物出参

请确保路径正确,格式符合要求。


3) HTTPS 校验失败

优先排查:

  • 访问是否使用了 <SIGN_SERVER_DOMAIN>

  • hosts/DNS 是否正确解析

  • curl_cafile 是否可用

快速验证:

 curl --cacert /root/ca/ca.pem -I https://<SIGN_SERVER_DOMAIN>/

3 个赞