国密安全启动:UEFI Secure Boot 中 SM2/SM3 签名验证的部署与实践

国密算法 · 2026-06-06 · 50 阅读

前言

2024 年,一篇题为《微软掌控的UEFI CA,正在卡国产供应链脖子》的文章引发了行业广泛讨论。问题的核心在于:UEFI Secure Boot 的证书体系由微软主导的 UEFI CA 控制,国产操作系统和固件的签名依赖外部 CA 签发,一旦供应链受阻,系统更新和部署就会陷入被动。

与此同时,随着 GB/T 39786-2021《信息安全技术 信息系统密码应用基本要求》的落地,以及密评(密码应用安全性评估)对固件安全启动的要求日趋明确,越来越多的企业需要在 UEFI Secure Boot 中构建基于国密算法(SM2/SM3)的自主可控信任链。

本文基于 openEuler 22.03 LTS 和 openAnolis 国密安全启动白皮书,给出完整的部署方案:

  • 国密 PKI 证书链:建立根 CA → 中间 CA → 签名证书的三级体系
  • 固件签名:用 sbsigntools 对 shim、grub2、内核进行 SM2-SM3 签名
  • UEFI 安全启动:部署国密 PK/KEK/DB,实现固件级 SM2 签名验证
  • 安全策略更新:国密签名的 DBX 黑名单更新机制
  • 踩坑记录:实际部署中的典型问题与解决方案
⚠️ 安全警告:安全启动密钥(尤其是 PK)一旦烧录到固件中,通常不可更改。操作失误可能导致设备无法启动。请在测试环境中充分验证后再部署到生产环境。

一、UEFI Secure Boot 与国密算法

1.1 UEFI Secure Boot 信任链

UEFI Secure Boot 的四个核心密钥数据库:

密钥/数据库作用更新方式国密适配
PK (Platform Key)平台根信任锚,控制 KEK 更新固件 OTP 烧录,通常不可更改SM2-256 公钥
KEK (Key Exchange Key)控制 DB/DBX 更新的签名密钥通过 PK 签名的更新包SM2-256 公钥
DB (Signature Database)允许执行的签名白名单通过 KEK 签名的更新包SM2-SM3 签名列表
DBX (Forbidden Database)吊销的签名黑名单通过 KEK 签名的更新包SM2-SM3 签名列表

1.2 国密算法在 Secure Boot 中的映射

标准 UEFI 算法国密替代说明
SHA-256 (Hash)SM3固件镜像摘要算法
RSA-2048/3072 签名SM2-256 签名证书和签名验证
PKCS#7 Signed DataGM/T 0010 SM2 签名消息语法签名数据格式
ECDSA (可选)SM2 数字签名GM/T 0003.2
关键标准:GM/T 0010-2023《SM2密码算法加密签名消息语法规范》定义了国密 SM2 签名的消息格式,与 PKCS#7 兼容但使用 SM3 替代 SHA-256。

1.3 现有 UEFI Secure Boot 的国密局限性

根据 openAnolis 国密安全启动白皮书的分析,标准 UEFI Secure Boot 存在以下国密兼容性问题:

  • Hash 算法限制:UEFI 规范仅支持 SHA-224/256/384/512,不原生支持 SM3
  • 签名格式不兼容:仅支持 PKCS#7 Signed Data,不兼容 GM/T 0010 定义的 SM2 签名格式
  • PKI 依赖外部 CA:UEFI CA 由微软主导,无法自主控制
  • 缺乏国密优先级:白名单中所有证书处于相同等级,无法强制国密验证

二、环境准备

2.1 硬件与软件环境

组件版本/型号说明
服务器华为 TaiShan 200 / 浪潮 K1 Power支持 UEFI Secure Boot
UEFI 固件edk2 (支持国密 SM2 编译选项)需编译启用国密支持的固件
操作系统openEuler 22.03 LTS / openAnolis 8已集成国密安全启动组件
sbsigntools0.9.3+国密签名工具
shim15.4+ (国密版)支持 SM2 验签的 shim
grub22.06+ (国密版)支持 SM2 验签的 grub2
国密 CA 工具自研 / 三未信安 / 江南天安签发国密证书

2.2 编译支持国密的 edk2 固件

注意:物理服务器的固件编译需要参考具体硬件厂商的开发手册。华为 TaiShan 和浪潮等厂商通常提供已集成国密支持的固件版本,可直接联系厂商获取。

2.3 安装国密版 shim 和 grub2

BASH
# openEuler 22.03 已集成国密安全启动组件
sudo dnf install shim-signed grub2-efi-x64 sbsigntools

# 验证 shim 是否支持国密
pesign -S -i /boot/efi/EFI/centos/shimx64.efi | grep -i "digest"
# 应看到 SM3 相关的摘要信息

# 验证 sbsigntools 版本和支持的算法
sbsign --version
sbsign --list-algorithms
# 应包含 SM2 和 SM3 相关选项

三、国密 PKI 证书链建立

3.1 证书链架构

3.2 生成国密根 CA

3.3 生成 PK/KEK/DB 证书

四、固件镜像签名

4.1 签名工具链

国密固件签名使用 sbsigntools 的 SM2 支持版本。签名流程:

CODE
┌────────────┐    ┌────────────┐    ┌────────────┐    ┌────────────┐
│ 内核镜像    │───▶│  SM3 摘要   │───▶│  SM2 签名   │───▶│ 签名镜像    │
│ vmlinuz    │    │  (Hash)    │    │  (Sign)    │    │ .signed    │
└────────────┘    └────────────┘    └────────────┘    └────────────┘
                                        │
                                        ▼
                                  ┌────────────┐
                                  │ DB 私钥    │
                                  │ sm2-db.key │
                                  └────────────┘

4.2 签名脚本

4.3 部署签名后的固件

五、UEFI 安全启动部署

5.1 准备密钥数据库

5.2 通过 UEFI 固件界面部署

警告:以下操作涉及固件级修改,操作失误可能导致设备无法启动。请确保有物理访问能力或远程管理(IPMI/iLO)可用。
部署步骤:

  • 进入 UEFI 设置界面:开机按 DelF2 进入
  • 进入 Secure Boot 配置:Security → Secure Boot Configuration
  • 清除现有密钥:Reset to Setup Mode(清除所有现有密钥)
  • 部署 PK:选择 PK 选项,加载 pk.auth 文件
  • 部署 KEK:选择 KEK 选项,加载 kek.auth 文件
  • 部署 DB:选择 DB 选项,加载 db.auth 文件
  • 启用 Secure Boot:将 Secure Boot Mode 设为 Enabled
  • 保存并退出

5.3 通过命令行部署(高级)

六、安全策略更新(DBX 黑名单)

6.1 创建 DBX 更新包

当发现某个固件的签名存在安全漏洞时,需要将其加入 DBX 黑名单:

6.2 自动化安全策略更新

七、踩坑实录

坑 1:sbsigntools 版本不支持 SM2

现象:执行 sbsign 时报错 unrecognized algorithmcertificate verification failed

原因:系统自带的 sbsigntools 版本较旧,不支持 SM2/SM3 算法。

解决

BASH
# 检查版本
sbsign --version
# 需要 >= 0.9.3

# 从源码编译支持国密的版本
git clone https://github.com/openEuler/sbsigntools.git
cd sbsigntools
git checkout gm-support  # 国密支持分支
autoreconf -fi
./configure --with-gmssl
make
sudo make install

坑 2:shim 无法验证 SM2 签名

现象:shim 启动时提示 verification failed: Security Violation,拒绝加载 grub2。

原因:shim 版本不支持 GM/T 0010 定义的 SM2 签名消息格式。

解决

BASH
# 确认 shim 版本
pesign -S -i /boot/efi/EFI/centos/shimx64.efi | head -5

# 需要国密版 shim(openEuler/openAnolis 已集成)
# 如果使用 CentOS,需要手动编译
git clone https://github.com/rhboot/shim.git
cd shim
# 应用国密补丁后编译
make ARCH=x86_64 CROSS_COMPILE= VENDOR_CERT_FILE=./ca.cer

坑 3:UEFI 固件不识别 SM2 证书

现象:在 UEFI 设置界面加载证书时,提示 Invalid certificate format

原因:部分 UEFI 固件的 SM2 支持需要特定的证书格式或 OID。

解决

坑 4:内核更新后安全启动失败

现象:系统更新内核后,新内核无法通过安全启动验证。

原因:新内核未被 DB 证书签名。

解决:配置内核更新自动签名:

坑 5:DBX 更新后系统无法启动

现象:部署 DBX 黑名单后,系统提示 Access Denied 无法启动。

原因:DBX 中的哈希匹配到了正在使用的合法签名。

解决

BASH
# 紧急恢复:进入 UEFI 设置,临时禁用 Secure Boot
# 然后移除错误的 DBX 条目

# 查看当前 DBX 内容
efivar -p -n dbx-d719b2cb-3d3a-4593-a300-11057988efb2 | xxd

# 清除 DBX(需要进入 Setup Mode)
efi-updatevar -d dbx

八、验证与测试

8.1 验证安全启动状态

8.2 安全启动抗攻击测试

九、总结

国密安全启动是构建自主可控系统安全基线的关键环节。通过 SM2/SM3 算法替代 RSA/SHA-256,可以从固件层面建立不受外部 CA 控制的信任链。

关键要点回顾

  • 证书链:根 CA → 中间 CA → PK/KEK/DB 证书,全部使用 SM2-256 + SM3
  • 签名工具:sbsigntools 0.9.3+ 支持 SM2 签名,shim/grub2 需要国密版
  • 部署顺序:先 PK → 再 KEK → 最后 DB,不可逆序
  • 密钥安全:根 CA 私钥应离线存储在 HSM 中,DB 私钥用于日常签名
  • 更新机制:内核更新需自动签名,DBX 黑名单需定期更新
参考标准
  • GM/T 0002-2012《SM2 椭圆曲线公钥密码算法》
  • GM/T 0003.2-2012《SM2 第2部分:数字签名算法》
  • GM/T 0004-2012《SM3 密码杂凑算法》
  • GM/T 0010-2023《SM2密码算法加密签名消息语法规范》
  • GB/T 39786-2021《信息安全技术 信息系统密码应用基本要求》
  • GM/T 0028-2014《密码模块安全技术要求》

参考来源