3. SM2 密钥生成与管理:密钥对生成原理、私钥安全存储与公钥证书体系
这一章,我们聊聊 SM2 密钥的“一生”——从怎么生出来,到怎么安全地藏起来,再到怎么让别人相信这把公钥是你的。说白了,就是密钥的生成、存储和认证。
我在做安全启动方案时,见过太多因为密钥管理不当导致整个信任链崩塌的案例。密钥管理,是整个安全体系的基石。这块要是出了纰漏,后面做得再花哨也没用。
3.1 SM2 密钥对生成原理
SM2 是一种基于椭圆曲线的公钥密码算法。它的密钥对生成,本质上就是在椭圆曲线上找一个点。
具体来说,SM2 使用一条特定的椭圆曲线,参数由国家密码管理局定义。私钥是一个随机的大整数,公钥则是私钥与椭圆曲线基点的标量乘法结果。
核心公式:
公钥 P = 私钥 d * 基点 G
其中 d 是随机生成的私钥,G 是 SM2 标准曲线上的固定基点。
生成流程大致分三步:
- 生成随机数:使用真随机数发生器(TRNG)或合格的伪随机数发生器(DRBG),产生一个 256 位的随机数作为私钥 d。
- 有效性检查:检查 d 是否在 [1, n-2] 范围内(n 是椭圆曲线的阶)。如果不在,重新生成。
- 计算公钥:执行标量乘法运算 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 摘要进行签名
在安全启动中,证书链是这样的:
- 根 CA 证书:自签名,预置在设备 SE 中。这是信任的锚点。
- 中间 CA 证书:由根 CA 签发,用于签发设备证书。可以定期轮换。
- 设备证书:由中间 CA 签发,包含设备的公钥和身份信息。
启动时,BootROM 用预置的根 CA 公钥验证中间 CA 证书,再用中间 CA 公钥验证设备证书,最后用设备公钥验证固件签名。环环相扣。
证书链验证要点:
- 每一级证书的签名必须由上一级私钥生成
- 证书有效期必须包含当前时间
- 密钥用途扩展必须允许当前操作(如 digitalSignature)
- 证书不能被吊销(需要 CRL 或 OCSP 检查)
下面这张图,展示了 SM2 密钥对生成、存储和证书体系的整体关系:
最后,说一个我踩过的坑。证书链验证时,很多人只检查签名,忽略了证书有效期和密钥用途。我曾经见过一台设备,因为 RTC 电池没电导致系统时间回到 1970 年,所有证书验证都失败。从那以后,我要求所有安全启动方案必须有一个可信时间源,或者在证书验证时加入时间容差。
密钥管理没有捷径。每一步都扎实了,安全启动的根基才稳。