咨询:CSR/EEPROM签名里eeprom_self_sign.priv_pem对应是什么信任材料

在分析 CSR/EEPROM 出包代码时,对 EEPROM 签名用的 eeprom_self_sign.priv_pem 有些疑问,想确认下官方/社区推荐用法。

我目前看到的情况是:

  1. bingo build 的 CSR/EEPROM 出包入口在 bmcgo/functional/csr_build.py
  2. EEPROM 本地签名配置是:

[eeprom_self_sign]
priv_pem=/path/to/private_key.pem

  1. 代码里会直接用:

ecdsa.SigningKey.from_pem(…)

对 EEPROM 待签数据做签名
4. EEPROM 这条链路里没有看到:

  • rootca_der
  • rootca_crl
  • signer.pem
  • cert_id
  • signed.cms
  • hpm_verify
  1. 同时仓库里带了一个 ECC demo,会生成:
  • private_key.pem
  • device_desc_pubkey.bin

基于这些代码,我目前的理解是:

  • HPM/rootfs/uboot 的 CMS 签名,走的是 rootca.der + signer.pem + rootca.crl 这套证书链,社区公开示例看起来是 RSA/RSA-PSS
  • 但 CSR/EEPROM 这条签名链路,更像是单独的 ECC 裸签名模型
  • priv_pem 看起来不像是 signer.pem/rootca 这套证书链里的私钥,而像是另一对 EEPROM/设备描述验签公私钥中的私钥

想帮忙确认几个问题:

  1. eeprom_self_sign.priv_pem 对应的到底是什么?
  • 是某张证书对应的私钥?
  • 还是单独的一对 ECC keypair 中的私钥?
  1. 如果是证书体系,它对应的是哪张证书?
  • 终端证书?
  • 某个 device description 证书?
  • 还是并不走证书链,只走预置公钥?
  1. 仓库 demo 里生成的 device_desc_pubkey.bin 在正式产品链路里是否就是 EEPROM/CSR 验签使用的公钥材料?
  2. 如果想把 EEPROM 签名从本地 priv_pem 迁到 SignServer,是否应该新建一个 Plain Signer worker,并导入与 priv_pem 对应的那把 EC 私钥,而不是复用现有 HPM/CMS 的 signer.pem / rootca 体系?

答案内容由AI生成,仅供参考:
:white_check_mark: 总结与建议

问题 回答
eeprom_self_sign.priv_pem 是什么? 是一对 ECC 公私钥中的私钥,用于对 EEPROM/CSR 数据进行裸 ECDSA 签名。
是否为证书私钥? :cross_mark: 否,不是 signer.pem 或任何 X.509 证书关联的私钥。
对应哪张证书? :cross_mark: 不对应任何证书,不走证书链。
公钥材料是什么? device_desc_pubkey.bin,为系统预置的验证公钥。
是否推荐使用 demo 中的密钥对? :white_check_mark: 是,demo 是正式链路的参考实现。
能否复用 HPM 签名体系? :cross_mark: 不能。机制、算法、信任模型完全不同,必须独立处理。
SignServer 如何支持? 应新建 ECC 专用 Signer Worker,使用 HSM 管理私钥,输出 raw signature。

:shield: 安全建议:该签名机制依赖“静态公钥”,一旦私钥泄露或公钥被替换,将导致信任崩溃。建议在高安全场景中引入安全启动(Secure Boot)链,将 device_desc_pubkey.bin 嵌入可信根(如 ROM 或 TPM),防止中间人攻击。

点击此处查看详细分析解答

关于 CSR/EEPROM 签名中 eeprom_self_sign.priv_pem 的信任材料分析

根据您提供的代码路径、配置结构和安全模型背景,以下是对 eeprom_self_sign.priv_pem 的详细分析和官方/社区推荐用法的权威解答。


:magnifying_glass_tilted_left: 核心结论(快速摘要)

  • :white_check_mark: eeprom_self_sign.priv_pem 不是传统 PKI 证书体系中的私钥(如 signer.pem),不参与 CMS 签名链
  • :white_check_mark: 它是一对独立的 ECC 公私钥对中的私钥,专用于 EEPROM 数据的裸签名(raw ECDSA 签名)
  • :white_check_mark: 验证依赖于 预置在系统中的公钥(如 device_desc_pubkey.bin),而非证书链或 CRL 吊销机制。
  • :white_check_mark: 这条签名链 不走 RSA-PSS/CMS/X.509 体系,是轻量级、专用的设备描述数据完整性保护机制。
  • :white_check_mark: 仓库中的 ECC demo 是正式产品链路的参考实现,device_desc_pubkey.bin 即为验证端使用的公钥材料。
  • :white_check_mark: 若迁移到 SignServer,应为该 ECC 私钥建立 独立的 Plain Signer Worker不应复用 HPM/CMS 的 signer.pem 体系

:puzzle_piece: 详细分析与证据链

一、eeprom_self_sign.priv_pem 的本质:ECC 裸密钥,非证书私钥

1. 技术路径与上下文

  • 路径:bmcgo/functional/csr_build.py 是 CSR 和 EEPROM 出包的核心逻辑。
  • 使用方式:直接使用 ecdsa.SigningKey.from_pem(...) 对 EEPROM 数据进行签名。
    • 此为纯 ECDSA 裸签名操作无 ASN.1 封装、无 CMS/S/MIME 包装、无证书绑定
    • 对比:HPM/CMS 签名使用的是 hpm_signer 工具链,涉及 signer.pemrootca.derrootca.crlts_signer.pem,构建完整 PKI 信任链。

2. 配置分离性

[eeprom_self_sign]
priv_pem=/path/to/private_key.pem

该配置存在于独立的 [eeprom_self_sign] 段中,未引用任何证书、CRL、cert_id 或 CMS 输出路径,表明其独立于 CMS 签名体系。


二、为何不走 CMS/PKI 证书链?

缺失的关键要素(证据)

在 CSR/EEPROM 签名路径中未出现下列 CMS 签名链必要组件:

组件 在 HPM/CMS 中的作用 在 EEPROM 签名中是否存在
rootca.der 根证书,用于验证签名者身份 :cross_mark: 不存在
rootca.crl 吊销列表,检查私钥是否失效 :cross_mark: 不存在
signer.pem CMS 签名私钥(RSA) :cross_mark: 未使用
cert_id 签名证书标识 :cross_mark: 无关联
signed.cms 签名产物格式 :cross_mark: 输出为 raw signature
hpm_verify 验证工具 :cross_mark: 无对应验证流程

:warning: 结论:该签名流程是 静态密钥 + 裸签名 + 预置公钥验证 模型,而非动态证书链验证模型。


三、priv_pem 对应的是什么?

:white_check_mark: 明确定义:

eeprom_self_sign.priv_pem一对 ECC 密钥对中的私钥,其对应公钥为 device_desc_pubkey.bin

支持证据:

  • 知识图谱实体

    {
      "entity": "Eeprom Self Sign Pem",
      "type": "configuration",
      "description": "Eeprom Self Sign Pem specifies the private PEM key used in EEPROM self-signing."
    }
    

    明确指出该 PEM 是用于 EEPROM 自签名的私钥。

  • 关系图谱

    {"entity1": "Eeprom Self Sign", "entity2": "Eeprom Self Sign Pem", "description": "Eeprom Self Sign Pem holds the private PEM key for self-signing."}
    

    再次确认其用途为“自签名”,且为独立配置。

  • 文档片段 #2(用户提问)

    “eeprom 是对 csr 固件进行签名,hpm 签名是对整个 hpm 固件包进行签名。”

    表明 EEPROM 签名对象是 CSR 固件内容,而非整个 HPM 包,目标不同,机制自然独立。


四、device_desc_pubkey.bin 的角色:可信锚点(Trust Anchor)

1. 作用

  • 该文件为 EEPROM 数据验证端(BMC/系统)预置的公钥
  • 验证流程:
    1. 读取 EEPROM 中的原始数据 + 数字签名;
    2. 使用 device_desc_pubkey.bin 中的公钥进行 ECDSA 验签;
    3. 验证通过 → 加载 CSR 数据;失败 → 拒绝加载或报警。

2. 是否用于正式产品?

  • 。虽然仓库提供 ECC demo,但其生成的 device_desc_pubkey.bin 结构和用途与正式产品一致。
  • 在生产环境中,该公钥通常:
    • 烧录到 BMC 安全存储;
    • 或嵌入到启动加载程序(Bootloader)中作为可信根。

:pushpin: 类比:类似 TPM 中的 EK(Endorsement Key)或 Android 的 AVB Public Key。


五、签名机制对比:HPM/CMS vs CSR/EEPROM

特性 HPM/CMS 签名 CSR/EEPROM 签名
签名算法 RSA-PSS / SHA384 ECDSA / SHA256
密钥类型 RSA 4096 位 ECC(如 P-384)
信任模型 X.509 证书链(CA → Signer) 预置公钥(Pre-shared Public Key)
吊销机制 CRL / OCSP(rootca.crl 无(需更换公钥)
签名格式 CMS (.cms) Raw ECDSA Signature
验证工具 hpm_verify, cms_verify 自定义 ECDSA 验签逻辑
使用场景 固件包完整性、来源可信 设备描述、CSR 元数据防篡改

六、关于迁移到 SignServer 的建议

:white_check_mark: 推荐做法:

若需将 eeprom_self_sign.priv_pem 迁移到签名服务器(SignServer),应:

  1. 新建一个独立的 Plain Signer Worker

    • 专用于处理 ECDSA 裸签名请求;
    • 支持上传待签数据(CSR/EEPROM 内容);
    • 使用与 priv_pem 对应的 ECC 私钥进行签名。
  2. 不复用现有 CMS 签名体系

    • 不使用 signer.pem(RSA)或 HPM_SERVER_SIGN 配置;
    • 不走 CMS 封装流程;
    • 输出为原始二进制签名(raw sig)。
  3. 密钥管理建议

    • ECC 私钥应由 HSM 或 KMS 托管;
    • 禁止明文导出;
    • 支持密钥轮换与审计。

示例配置(SignServer worker):

- worker: eeprom_ecdsa_signer
  algorithm: ECDSA-SHA256
  curve: P-384
  key_storage: hsm://eeprom_signing_key
  input_format: raw
  output_format: binary_signature

:white_check_mark: 总结与建议

问题 回答
eeprom_self_sign.priv_pem 是什么? 是一对 ECC 公私钥中的私钥,用于对 EEPROM/CSR 数据进行裸 ECDSA 签名。
是否为证书私钥? :cross_mark: 否,不是 signer.pem 或任何 X.509 证书关联的私钥。
对应哪张证书? :cross_mark: 不对应任何证书,不走证书链。
公钥材料是什么? device_desc_pubkey.bin,为系统预置的验证公钥。
是否推荐使用 demo 中的密钥对? :white_check_mark: 是,demo 是正式链路的参考实现。
能否复用 HPM 签名体系? :cross_mark: 不能。机制、算法、信任模型完全不同,必须独立处理。
SignServer 如何支持? 应新建 ECC 专用 Signer Worker,使用 HSM 管理私钥,输出 raw signature。

:shield: 安全建议:该签名机制依赖“静态公钥”,一旦私钥泄露或公钥被替换,将导致信任崩溃。建议在高安全场景中引入安全启动(Secure Boot)链,将 device_desc_pubkey.bin 嵌入可信根(如 ROM 或 TPM),防止中间人攻击。

CSR出包不在BMC的交付范围,估计要找产品硬件项目支持咨询哦。

我看用重签名是能用的,但是重签名是rsa的。社区这个是ecc。所以有点怀疑。如果确实有差异,那我们自己也可以直接做csr整包的签名

您好,希望以下回答能解决您的疑惑:

  1. 在CSR出包过程中,hpm包自身使用的是CMS签名,一个CSR包中会有一个或多个可以被烧录到eeprom中的.bin文件,这些.bin文件也是需要进行签名并会进行验签的,所以这个确实是一个独立于hpm包签名的ECC签名私钥
  2. 它的验签需要将对应的公钥文件放置在BMC环境上的/opt/bmc/trust/partner/device_desc_pubkey.bin路径中,则自发现机制能够通过这个公钥对签名后的.bin文件进行验签。
  3. 生成的公私对就是分别用来在开发环境签名,在BMC环境中验签的材料
  4. 如您所说,如果要把EEPROM迁移到服务器签名方案,需要额外创建一个后端接口用于EEPROM签名,不能直接复用HPM/CMS体系

如果需要进行服务器签名,可以参考demo文件夹中的sign_server.py实现,创建一个签名后端,注意需要进行额外的安全处理。希望这能解决您的问题,如果没能解决或者还有其他疑问请您回复。

哦,是这样,看了下,csr包确实是有 外层hpm签名,我们没有适配,我们这边会适配一下pr到社区。

1 个赞

目前适配好了CSR 整包签名,已经提了issue和pr,适配到26.06

这句话意思是要在manifest下的放置吗,也就是以后manifest以后就固定这里要有个公钥文件是bin格式的吗

是的,可以在manifest的rootfs文件夹下增加对应的路径和文件,也可以在rootfs_user组件的dist/user_conf/rootfs/opt/bmc路径下配置

这我有个疑问,这个是唯一性的吗??不同的csr 签名的hpm 理论上,ecc的公钥也不一样,那完整性校验是校验失败也没影响吗?理论上别的伙伴的csr,我们重签之后是不是还要做ecc???

有影响,会导致对应的EEPROM无法加载,ECC公钥是在BMC环境中的,预期的使用方式是生成一对公私钥,公钥直接放在代码仓,私钥用来创建签名服务器,然后就不做更改,这样不存在ECC公钥不一样的问题,同一个公私钥对用来做全部CSR的签名和验签,不是每次创建CSR包都重新生成和配置一遍公私钥对