3. SM2 密钥生成与管理:密钥对生成原理、私钥安全存储与公钥证书体系

这一章,我们聊聊 SM2 密钥的“一生”——从怎么生出来,到怎么安全地藏起来,再到怎么让别人相信这把公钥是你的。说白了,就是密钥的生成、存储和认证。

我在做安全启动方案时,见过太多因为密钥管理不当导致整个信任链崩塌的案例。密钥管理,是整个安全体系的基石。这块要是出了纰漏,后面做得再花哨也没用。

3.1 SM2 密钥对生成原理

SM2 是一种基于椭圆曲线的公钥密码算法。它的密钥对生成,本质上就是在椭圆曲线上找一个点。

具体来说,SM2 使用一条特定的椭圆曲线,参数由国家密码管理局定义。私钥是一个随机的大整数,公钥则是私钥与椭圆曲线基点的标量乘法结果。

核心公式:

公钥 P = 私钥 d * 基点 G

其中 d 是随机生成的私钥,G 是 SM2 标准曲线上的固定基点。

生成流程大致分三步:

  1. 生成随机数:使用真随机数发生器(TRNG)或合格的伪随机数发生器(DRBG),产生一个 256 位的随机数作为私钥 d。
  2. 有效性检查:检查 d 是否在 [1, n-2] 范围内(n 是椭圆曲线的阶)。如果不在,重新生成。
  3. 计算公钥:执行标量乘法运算 P = d * G,得到公钥点 P。

嗯,这里要注意。随机数的质量直接决定密钥的安全性。我曾经在项目中遇到过,某款芯片的随机数发生器在特定温度下输出有偏,导致生成的私钥可被预测。那真是个大坑。

避坑指南:

我曾经在产测环节发现,一批设备的 SM2 私钥竟然有重复。排查下来,是随机数种子被固件中的固定值覆盖了。所以,务必验证随机数源的熵源质量,最好在产线做一次随机数统计测试。

3.2 私钥安全存储:HSM 与 SE

私钥生成之后,最头疼的问题来了——放哪儿?

你不能把私钥明文写在 Flash 里,那等于把家门钥匙挂在门外。也不能放在普通文件系统里,太容易被读走。

实际工程中,私钥存储主要靠两种硬件:HSM(硬件安全模块)和SE(安全元件)。

特性 HSM SE
形态 独立硬件设备,通常为 PCIe 卡或网络设备 嵌入式安全芯片,集成在 PCB 上
性能 高,支持大量并发签名/解密 中低,适合单设备场景
安全等级 极高,通过 EAL4+ / FIPS 140-2 Level 3 认证 高,通过 CC EAL5+ 认证
典型应用 CA 根密钥、服务器签名密钥 设备身份密钥、启动密钥
成本 高(数万至数十万) 中(几元至几十元)

我个人习惯,在安全启动场景中,根密钥必须放在 HSM 里生成并保管。设备端的签名验证密钥,则放在 SE 中。为什么?

你想想看,如果根密钥被泄露,整个信任链就全完了。HSM 有物理防篡改、密钥永不离开硬件、审计日志等特性,能最大程度降低泄露风险。

对于设备端的私钥存储,SE 是更实际的选择。它内部有独立的 CPU、存储和加密引擎,私钥一旦写入,外部无法直接读取。只能通过 SE 提供的 API 执行签名操作。

我的经验:

选型 SE 时,别只看数据手册上的安全等级。我踩过坑——某款 SE 号称支持 SM2,但实际签名速度只有 5 次/秒,根本满足不了产线烧录需求。一定要拿实际固件跑一下性能测试。

3.3 公钥证书体系

私钥藏好了,公钥怎么分发?直接广播出去?不行。攻击者可以伪造一个公钥,声称是你的。

这就需要证书体系了。公钥证书,说白了就是一个权威机构(CA)对你的公钥做的数字签名。它把公钥和身份绑定在一起。

SM2 的证书体系遵循 GB/T 20518 标准,结构上兼容 X.509 v3 格式。一个典型的 SM2 证书包含:

  • 版本号:通常为 v3
  • 序列号:CA 分配的唯一编号
  • 签名算法:标识为 sm2-with-sm3
  • 颁发者:签发该证书的 CA 名称
  • 有效期:起止时间
  • 主体:证书持有者的身份信息
  • 公钥信息:SM2 公钥本身
  • 扩展项:密钥用途、基本约束等
  • CA 签名:CA 用其私钥对整个证书内容的 SM3 摘要进行签名

在安全启动中,证书链是这样的:

  1. 根 CA 证书:自签名,预置在设备 SE 中。这是信任的锚点。
  2. 中间 CA 证书:由根 CA 签发,用于签发设备证书。可以定期轮换。
  3. 设备证书:由中间 CA 签发,包含设备的公钥和身份信息。

启动时,BootROM 用预置的根 CA 公钥验证中间 CA 证书,再用中间 CA 公钥验证设备证书,最后用设备公钥验证固件签名。环环相扣。

证书链验证要点:

  • 每一级证书的签名必须由上一级私钥生成
  • 证书有效期必须包含当前时间
  • 密钥用途扩展必须允许当前操作(如 digitalSignature)
  • 证书不能被吊销(需要 CRL 或 OCSP 检查)

下面这张图,展示了 SM2 密钥对生成、存储和证书体系的整体关系:

SM2 密钥生命周期与证书体系 密钥对生成 TRNG → 随机数 d P = d * G → 公钥 私钥安全存储 HSM:根密钥 SE:设备密钥 公钥证书体系 根CA → 中间CA → 设备 X.509 v3 / GB/T 20518 生成随机数 d 检查 d 范围 计算 P = d * G 私钥 → HSM/SE 公钥 → 证书签发 注意 随机数质量 决定密钥安全 务必产线测试 建议 根密钥用 HSM 设备密钥用 SE 密钥不出硬件 证书链 根CA预置SE中 逐级验证 环环相扣

最后,说一个我踩过的坑。证书链验证时,很多人只检查签名,忽略了证书有效期和密钥用途。我曾经见过一台设备,因为 RTC 电池没电导致系统时间回到 1970 年,所有证书验证都失败。从那以后,我要求所有安全启动方案必须有一个可信时间源,或者在证书验证时加入时间容差。

密钥管理没有捷径。每一步都扎实了,安全启动的根基才稳。