签名包制作指导
更新时间: 2025/10/31
在Gitcode上查看源码

背景介绍

因2509版本进行了 Conan 升级,编译过程中会遇到种种问题,故本文介绍了 2509 签名包的编译过程,供大家参考。

环境准备

如果此前已安装 Ubuntu24.04,可跳过环境准备步骤。

1. WSL2 安装 Ubuntu24.04

PowerShell窗口执行

  • WSL2 安装 Ubuntu24.04
bash
wsl --set-default-version 2
wsl --install -d Ubuntu-24.04

如果在本步骤中出现错误,请确保您的操作系统支持 WSL,具体请参考安装 WSL | Microsoft Learn

  • 重启系统后打开 WSL 设置 Ubuntu 系统账号密码
bash
wsl
  • 设置 root 用户密码并设置 root 用户为 WSL 默认用户
bash
sudo passwd root
su root

在 /etc/wsl.conf 文件中添加内容

ini
[user]
default=root
  • 重启 WSL
bash
wsl --shutdown
wsl

2. docker 加载与运行

Wsl-ubuntu24.04 环境下执行

bash
docker pull swr.cn-north-4.myhuaweicloud.com/openubmc/ubuntu:24.04.2_25.09
  • 运行 docker image ls 查看镜像是否加载成功
bash
root@DESKTOP-15CE9VA:~# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
swr.cn-north-4.myhuaweicloud.com/openubmc/ubuntu 24.04.2_25.09 91c3ea6eedcd 12 days ago 6.27GB

创建 Container 实例

  • 创建工作文件夹,作为 WSL-Ubuntu24.04 和 docker 共享的文件夹,方便代码和构建产物管理。
bash
mkdir -p /root/gky_2509
  • 运行 docker run 创建 Container 实例 gky_2509
bash
docker run -it --mount type=bind,source=/root/gky_2509,target=/home/workspace --name gky_2509 swr.cn-north-4.myhuaweicloud.com/openubmc/ubuntu:24.04.2_25.09 /bin/bash
  • 通过 docker ps 查看创建的实例,可以看到 container id 对应的 Container 状态
bash
root@DESKTOP-15CE9VA:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f5e6956af1ac swr.cn-north-4.myhuaweicloud.com/openubmc/ubuntu:24.04.2_25.09 "/bin/bash" 56 minutes ago Up 56 minutes gky_2509

Container 内部署远程 conan 服务

  • 25.09 及之后的版本,所有组件使用的是 conan 2.x 作为打包工具,开发者需执行以下命令进行 conan 2.x 配置

    sdk conan remote命名遵循 https://conan.openubmc.cn/bmc_sdk_{版本号},如 25.12 对应 https://conan.openubmc.cn/bmc_sdk_25.12 25.12_LTS-SP1 对应 https://conan.openubmc.cn/bmc_sdk_25.12-LTS-SP1 latest一般为最新版本,如最新为25.12,https://conan.openubmc.cn/bmc_sdk_latest等同https://conan.openubmc.cn/bmc_sdk_25.12

    bash
    conan profile detect --force
    conan remote add openubmc_sdk 'https://conan.openubmc.cn/bmc_sdk_latest' --insecure --force
    conan remote login openubmc_sdk <openUBMC社区用户> -p <openUBMC社区用户密>
    
    conan remote add openubmc_opensource 'https://conan.openubmc.cn/openubmc_opensource' --insecure --force
    conan remote login openubmc_opensource<openUBMC社区用户> -p <openUBMC社区用户密>

社区版本构建

1. 配置 GitCode 账户

在源码安装之前需要配置 gitcode 账户,并在 gitcode 个人设置中配置 ssh 公钥:

bash
git config --global user.name <your username>
git config --global user.email <your email>
ssh-keygen -t rsa -b 2048 -C <your email>
cat ~/.ssh/id_rsa.pub

2. 开发者环境准备

配置 root 账户密码:

bash
sudo passwd root

拉取 manifest 仓代码到本地工作空间。

bash
cd /home/workspace
git clone git@gitcode.com:openUBMC/manifest.git
cd manifest

Manifest 切换到 2509 节点:

bash
git checkout br_release_openUBMC2509_20251230

之后,开发者需前往 openUBMC 社区软件应用中心下载 2509 版本对应的 bmcsdk,并将下载的 bmcsdk 文件存放在 manifest 代码仓目录下。然后,执行脚本文件进行环境初始化(此命令依赖 bmcsdk.zip 中的 hpm_tools、rtos_compiler、sdk,以及 lua-format)。

bash
python3 init.py -path ./bmc_sdk.zip -user USER -psw PASSWORD # USER和PASSWORD为openUBMC社区用户名和密码

3. Bingo 升级

bash
sudo apt update
apt policy openubmc-bingo
pip3 install openubmc-bingo
sudo apt update && sudo apt install gnupg
sudo mkdir -p /etc/apt/keyrings
gpg --keyserver keyserver.ubuntu.com --recv-keys BF3B2D407FDEDEA0DC91CC9412640FBCB175287A
gpg --export BF3B2D407FDEDEA0DC91CC9412640FBCB175287A | sudo tee /etc/apt/keyrings/openubmc.gpg >/dev/null
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/openubmc.gpg] https://openubmc-apt-repo.obs.cn-north-4.myhuaweicloud.com/Ubuntu/ noble main" | sudo tee /etc/apt/sources.list.d/openubmc.list
sudo apt update
apt policy openubmc-bingo
pip3 install openubmc-bingo
bingo upgrade

4. 编译 2509

bash
bingo build -b openUBMC -r openubmc_dev

构建签名包

获得 privatebinary.zip 和 dev_tools.zip,可放在 /home/workspace 下。

1. 高可用组件及工具安装

bash
apt update && pip install "conan>=2.0.0"
unzip dev_tools.zip && cd dev_tools
apt install -y rpm
cd compiler
rpm -ivh *.rpm
cp ./* /root/rtos_compiler/
cd ..
cd scripts
pip3 install *.whl
dpkg -i hw-ibmc-bmcgo_x86_64.deb
apt install -y -f
cd ..
cd hi1711
cp ./* /root/sdk/
cd ..
cd sdk
tar -zvxf bmc_sdk.tar.gz
cp ./* /root/sdk/
cp ./* /root/rtos_compiler/
cd ..
cp lua-format /usr/bin
cd ..
mkdir -p privatebinary
mv privatebinary.zip privatebinary
cd privatebinary
unzip privatebinary.zip
ls *.tar.gz | xargs -n1 tar xzvf
rm *.tar.gz privatebinary.zip
apt update && apt install -y rsync
rsync -av ./* /root/.conan2/p/
cd ..

在进行以上配置后,可根据实际情况,选择使用以下本地签名或远端签名其中一种方式来进行 hpm 签名,建议采用远端签名方式。

2. 本地签名

/root 下创建 ca 文件夹,将 rootca.crl 、rootca.der、 signer.pem、tsa.cnf、ts_signer.pem 放在 /root/ca 下,配置 manifest.yml。

yaml
base:
    signature:
        certificates:
            rootca_der: /root/ca/rootca.der
            rootca_crl: /root/ca/rootca.crl
            signer_pem: /root/ca/signer.pem
            timestamp_signer_pem: /root/ca/ts_signer.pem
            timestamp_signer_cnf: /root/ca/tsa.cnf

修改 manifest.yml 中 firmware_mgmt 的特性 community_enable 为false。

yaml
- conan: firmware_mgmt
    options:
    community_enable: false

修改 manifest.yml 中gpp files,将其中的*_BMC改为iBMC,将证书改为指向本地证书的路径。

yaml
gpp:
  files:
    # rootfs镜像文件固定为rootfs_BMC.img
    - file: ${work_out}/rootfs_iBMC.img
    - file: ${work_out}/rootfs_iBMC.tar.gz
    # rootfs_BMC.img的cms签名文件
    - file: ${work_out}/rootfs_iBMC.img.cms

    # 签名文件的证书吊销列表
    - file: /root/ca/rootca.crl
      dst: cms.crl
    # 签名的根证书
    - file: /root/ca/rootca.der
      dst: rootca.der

在manifest仓库的.bmcgo/config中添加如下配置

ini
[hpm_encrypt]
enable=true

3. 远端签名(签名服务器签名)

为提升固件安全性、降低证书泄露风险,建议采用自建签名服务器替代本地签名模式。本地签名需将签名证书直接提供给开发者,存在一定的安全隐患,而通过签名服务器,可在不暴露证书的前提下完成固件签名。 目前,该方案已与社区版 Bingo 软件完成集成。开发者只需在 manifest.yml 文件中进行相应配置,即可通过 Bingo 调用签名服务,无需接触证书,兼顾安全性与易用性。参考了简易签名服务器的自建方案 - Infrastructure SIG - openUBMC 论坛方案。

签名过程

bingo 与签名服务器的交互如下图所示:

构建阶段,先由 bingo 的签名模块向签名服务器发送POST请求,请求中包含待签名文件及签名相关信息。具体如下:

其中,待签名文件及签名参数包括:

参数类型解释
CertId字符串证书ID
FileName字符串待签名文件名
FileSha256字符串待签名文件sha256数据
Token字符串认证令牌
Version字符串协议版本

签名服务器根据收到的请求信息,进行签名,返回签名后的文件 signed.zip,解压后包含以下四个文件:

文件名解释
root.crlroot CA的crl文件
root.crl.sha256root CA的crl sha256
XXX.cms签名后的文件
XXX.cms.sha256签名后的文件 sha256

在使用 Bingo 构建 BMC 固件的过程中,系统会多次对特定文件执行签名操作。若配置了签名服务器,Bingo 会将待签名文件及其对应的 SHA256 校验值通过 POST 请求发送至签名服务器。签名服务器接收到请求后,首先验证文件的 SHA256 值以确保数据完整性,随后对文件进行签名,并将签名结果返回给 Bingo。Bingo 的签名模块收到签名后的文件后,继续执行后续构建流程。

整个通信过程中,所有传输的文件均通过 SHA256 校验机制进行完整性验证,有效防止数据在传输过程中被篡改。

此外,还包含若干扩展字段,用于增强签名服务的灵活性与安全性:

  • Token:签名服务器的认证令牌。每次签名请求必须携带该令牌,服务器会验证其合法性,若无效则拒绝签名请求。
  • CertId:证书标识符。签名服务器可配置多个证书,通过指定不同的 CertId 选择对应的证书进行签名,便于证书的轮换、吊销和精细化管理。
  • Version:协议版本号。用于标识当前通信协议的版本,便于未来 Bingo 签名模块升级时实现向后兼容,确保服务平稳演进。

签名服务的具体流程

基于以上签名过程,签名服务需实现以下核心功能模块:

  • 请求接收:通过POST接口接收签名请求,为必选项。
  • 安全验证:依次验证Token、CertId、Version合法性。该选项可根据实际情况应用,为可选项。
  • 数据校验:对请求文件进行完整性验证,为必选项。
  • 签名执行:执行核心签名处理逻辑,为必选项。
  • 结果返回:将签名后的文件打包返回,为必选项。

签名处理流程基于 bingo 本地文件签名实现,通过分析构建日志获得以下关键命令序列:

bash
# 1. 证书格式转换
openssl x509 -in /root/ca/rootca.der -inform der -outform pem -out rootca.pem

# 2. CRL格式转换  
openssl crl -in /root/ca/rootca.crl -inform der -outform pem -out cms.crl.pem

# 3. 执行签名
hpm_signer -s /root/ca/signer.pem \
           -t /root/ca/ts_signer.pem \
           -T /root/ca/tsa.cnf \
           -i /home/workspace/manifest/temp/build_openUBMC_debug_dev/sdk/origin_uboot_debug/uboot.bin \
           -o /home/workspace/manifest/temp/build_openUBMC_debug_dev/sdk/origin_uboot_debug/uboot.bin.cms

# 4. 签名验证
hpm_verify -r rootca.pem \
           -C cms.crl.pem \
           -c /home/workspace/manifest/temp/build_openUBMC_debug_dev/sdk/origin_uboot_debug/uboot.bin \
           -s /home/workspace/manifest/temp/build_openUBMC_debug_dev/sdk/origin_uboot_debug/uboot.bin.cms

文件说明:

  • 输入文件: uboot.bin(待签名文件)
  • 输出文件: uboot.bin.cms(已签名文件)
  • 证书材料: rootca.der, rootca.crl, signer.pem, ts_signer.pem, tsa.cnf

签名服务搭建指南

环境准备
text
系统:Ubuntu24.04
基础镜像:openubmc (BMC构建镜像)
代码编译

可选择基于 Go 搭建 HTTP 服务端, 使用以下编译命令可将 Go 项目编译为 Linux 64位可执行文件 cms-server。

bash
GOOS=linux GOARCH=amd64 go build -o cms-server main.go
签名服务部署

证书部署示例结构:

text
/etc/cms-certs/
├── kunlun/
│   ├── signer.pem
│   ├── ts_signer.pem
│   ├── tsa.cnf
│   ├── rootca.der
│   └── rootca.crl
└── other-cert/
    ├── signer.pem
    └── ...

将 Go 编译的签名服务程序 cms-server 部署为系统服务。Systemd 服务配置示例:

bash
cat > "/etc/systemd/system/cms-signer.service" << EOF
[Unit]
Description=CMS Sign Server
After=network.target        # 在网络服务之后启动

[Service]
Type=simple
WorkingDirectory= /opt/cms-signer
ExecStart=/opt/cms-signer/cms-server -certs /etc/cms-certs  # 启动命令
Restart=always             # 自动重启
RestartSec=5               # 重启间隔
StandardOutput=journal     # 日志输出到系统日志
StandardError=journal

[Install]
WantedBy=multi-user.target  # 多用户模式下启用
EOF

配置签名服务为开机自启动服务:

bash
systemctl daemon-reload    # 重新加载服务配置
systemctl enable cms-signer.service  # 设置开机自启
systemctl start cms-signer.service   # 立即启动服务
systemctl status cms-signer.service --no-pager  # 检查状态

配置过程

manifest.yml中进行如下修改:

yaml
  signature:
    files:
      - file: ${product}/ca/rootca.crl
        dst: cms.crl
    simple_signer_server:
      cert_id: kunlun
      url: "http://192.168.1.199:8089/sign"
      rootca_der: "${product}/ca/rootca.der"
      ssl_verify: false

修改 manifest.yml 中gpp files,将其中的*_BMC改为iBMC。

yaml
gpp:
  files:
    # rootfs镜像文件固定为rootfs_BMC.img
    - file: ${work_out}/rootfs_iBMC.img
    - file: ${work_out}/rootfs_iBMC.tar.gz
    # rootfs_BMC.img的cms签名文件
    - file: ${work_out}/rootfs_iBMC.img.cms

参数说明:

  • url: 签名服务地址(生产环境建议使用 HTTPS)
  • rootca_der: 伙伴根证书路径
  • cert_id: 签名证书 ID
  • ssl_verify: HTTPS 证书验证开关

将伙伴自生成的 rootca.crl 和 rootca.der 替换 manifest/build/product/ca 下的默认 rootca.crl 和 rootca.der。关于证书的生成,可参考自签名CA创建以及HPM签名指导 - CICD SIG - openUBMC 论坛

4. Dat 文件替换

特别注意:

build/product/BMC/openUBMC/rootfs/etc/system/system/multi-user.target.wants 路径下的 .service 文件必须为软链接

bash
 ls -l build/product/BMC/openUBMC/rootfs/etc/systemd/system/multi-user.target.wants

如果不是软链接则在 manifest 执行以下命令:

bash
cd build/product/BMC/openUBMC/rootfs/etc/systemd/system/multi-user.target.wants
ls *.service |awk -F',' '{print $1}'| xargs -P 12 -I {{}} ln -sf ../{{}} {{}}

把这两个文件复制到 manifest 的 build/manufacture/misc 目录下(解决升级密钥问题)

5. 添加高可用组件

manifest.yml 文件中,在 dependencies: 下增加以下配置:

yaml
- conan: power_strategy/1.70.74@openubmc/stable
- conan: cooling/1.70.75@openubmc/stable
- conan: ai_engine/1.90.3@openubmc/stable
- conan: fault_diagnosis/1.90.85@openubmc/stable
- conan: metric_analyzer/1.90.18@openubmc/stable
- conan: tpcm/1.90.15@openubmc/stable
- conan: trust/1.90.25@openubmc/stable
- conan: iam/1.90.12@openubmc/stable
- conan: siteai/v100r025c10spc001b100_001@openubmc/stable
- conan: sitedata/v100r025c10spc001b100_001@openubmc/stable
- conan: hisec_ict_ne/24.1.13.b001@openubmc/stable
- conan: license/1.80.6@openubmc/stable
- conan: adaptive_lm/v100r009c00spc300b100@openubmc/stable
- conan: storelib/07.1002.0100.0000.b006_03@openubmc/stable
- conan: storelibit/07.0700.0200.0600.b003@openubmc/stable
- conan: storelibir3/16.02.b002@openubmc/stable
- conan: storagecore/5.25.11.0.b002@openubmc/stable
- conan: linux_kernel/5.10.0-60.18.0.50.oe2203-h5058@openubmc/stable
- conan: taishanserver2.9.0_csr/0.0.375@openubmc/stable
- conan: taishanserver2.10.0_csr/1.0.18@openubmc/stable

taishanserver2.9.0_csr 如果重复则先暂时删除 taishanserver2.9.0_csr 组件(vpd 已经自带 taishan 仓的 csr)

因高可用组件中包括 iam/1.90.12@openubmc/stable,因此需去掉 dependencies:下原有的 iam。

yaml
- conan: iam

6. 修改高可用组件启动配置

修改 build/product/BMC/openUBMC/rootfs/opt/bmc/apps/hica/subsys/energy/config.cfg

新增

ini
config:include_app("cooling")
config:include_app("power_strategy")

修改 build/product/BMC/openUBMC/rootfs/opt/bmc/apps/hica/subsys/ras/config.cfg

新增

ini
config:include_app("fault_diagnosis")
config:include_app("metric_analyzer")
config:include_app("ai_engine")

修改 build/product/BMC/openUBMC/rootfs/opt/bmc/apps/hica/subsys/security/config.cfg

新增

ini
config:include_app("trust")

修改 build/product/BMC/openUBMC/rootfs/opt/bmc/conf/launch_control.json 新增

json
{
    "components": [
        {
            "name": "cooling",
            "type": "fork"
        },
        {
            "name": "power_strategy",
            "type": "fork"
        }
    ],
    "delay": {
        "seconds": 15,
        "uptime": 100
     }
 }

新增

json
{
    "components": [
        {
            "name": "ai_engine",
            "type": "fork"

        },
        {
            "name": "fault_diagnosis",
            "type": "fork"
        },
        {
            "name": "metric_analyzer",
            "type": "fork"
        }
    ],
    "delay": {
        "seconds": 20,
        "uptime": 100
    }
}

新增

json
{
    "name": "trust",
    "type": "fork"
}

新增

json
{
    "name": "license",
    "type": "fork"
}

7. Busybox工具集成

集成 busybox 工具,用于使用 telnet 查看调试日志等。

manifest目录下:

bash
git clone https://gitcode.com/openUBMC/conan_index.git
cd conan_index/recipes2/busybox/all
conan create . --name=busybox --version=1.34.0 --user=openubmc --channel=release --profile=profile.ini

配置 manifest.yml,增加 debug_dependencies 配置。

yaml
debug_dependencies:
  - conan: busybox/1.34.0@openUBMC.release/stable

8. 修改 make_uboot_img.py

修改 /usr/local/bin/make_uboot_img.py 第九行,将 bingo 改为 bmcgo

9. Flatbuffers 问题处理

bash
wget https://github.com/google/flatbuffers/archive/v2.0.0.tar.gz -O flatbuffers-2.0.0.tar.gz
tar -zxf flatbuffers-2.0.0.tar.gz
mkdir flatbuffers-2.0.0/build
cd flatbuffers-2.0.0/build
sudo cmake ..
sudo make -j8 install

10. 编译构建

bash
bmcgo build -b openUBMC -r openubmc_dev