基于 GM/T 0034-2014 构建国密 CA 证书认证系统:从密钥管理到证书签发的完整实战

国密算法 · 2026-07-20 · 5 阅读

前言

大多数国密改造文章止步于"配置 Nginx 国密密码套件"或"调用 SM4 加密数据",很少有人深入到底层 PKI 体系。一个完整的国密 CA(Certificate Authority)证书认证系统,需要满足 GM/T 0034-2014《基于 SM2 密码算法的证书认证系统密码及其相关安全技术规范》的要求,涵盖:根 CA 密钥生成与保护、中间 CA 签发策略、证书生命周期管理、吊销机制、密钥管理中心(KMS)对接。

本文不重复标准条文(参见知识库 GM/T 0034-2014 证书认证系统),而是从零构建一个可运行的国密 CA 系统原型,所有代码均基于 gmssl 和 Tongsuo 国密库实现。

环境要求:Python 3.10+、gmssl ≥ 2.2.0、Tongsuo ≥ 8.3.0。

一、国密 CA 系统架构

1.1 三层架构模型

GM/T 0034-2014 第 5 章定义了证书认证系统的三层架构:

1.2 密钥管理中心(KMS)

GM/T 0034-2014 第 6 章要求 CA 系统必须对接密钥管理中心,实现:

  • 密钥生成:CA 私钥在 KMS 内部生成,私钥不出 KMS
  • 密钥备份:支持密钥分割备份(M-of-N 方案)
  • 密钥轮换:支持 CA 密钥定期轮换
  • 密钥销毁:支持安全销毁过期密钥
实际部署中,KMS 通常使用硬件安全模块(HSM)实现,如:
  • 江南计算技术研究所的 JLSM 系列
  • 三未信安的 SJK1926 密码机
  • 渔翁信息的 SM2 加密机

1.3 国密 OID 体系

国密 CA 系统使用的核心 OID:

对象OID说明
SM2 曲线参数1.2.156.10197.1.301SM2 椭圆曲线公钥密码算法
SM2WithSM3 签名1.2.156.10197.1.501SM2 数字签名算法(配合 SM3)
SM3 哈希算法1.2.156.10197.1.401SM3 密码杂凑算法
SM4-CBC 加密1.2.156.10197.1.104.2SM4 分组密码 CBC 模式
SM9 标识密码1.2.156.10197.1.601SM9 标识密码算法(可选)

二、根 CA 密钥生成

2.1 SM2 密钥对生成

根 CA 的 SM2 密钥对生成是 PKI 信任链的起点。gmssl 3.2.x 的密钥生成需要注意:CryptSM2 构造函数接受 (public_key, private_key) 两个参数,私钥是 64 字符 hex(32 字节),公钥是 128 字符 hex(64 字节,不含 04 前缀)。

运行输出:

CODE
根 CA 私钥: a1b2c3d4e5f6a7b8...9f0e1d2c
根 CA 公钥: 3f8a9b0c1d2e3f4a...5b6c7d8e

2.2 根 CA 自签名证书

根 CA 证书是自签名的,使用 SM2WithSM3 算法:

⚠️ 关键陷阱cryptography 46.x 支持 hashes.SM3() 哈希算法,但不支持 ec.SM2() 密钥生成。需要 SM2 操作时,必须使用 gmssl 库或 Tongsuo/BabaSSL。两者密钥格式不兼容,不能混用。

2.3 使用 Tongsuo 生成根 CA 证书

Tongsuo(原 BabaSSL)是支持国密算法的 OpenSSL 分支,原生支持 SM2 密钥操作:

BASH
# 使用 Tongsuo 生成 SM2 根 CA 密钥
openssl ecparam -genkey -name SM2 -out root-ca.key

# 生成自签名根 CA 证书(SM2WithSM3)
openssl req -new -x509 -key root-ca.key -out root-ca.crt \
    -days 3650 -sm3 -sigopt "sm2_id:1234567812345678" \
    -subj "/C=CN/ST=Beijing/O=GM Root CA/CN=GM Root CA SM2"

# 查看证书
openssl x509 -in root-ca.crt -text -noout

三、中间 CA 签发

3.1 中间 CA 密钥生成

中间 CA 的密钥生成流程与根 CA 类似,但证书由根 CA 签发:

3.2 证书模板设计

GM/T 0034-2014 第 7 章要求 CA 系统支持证书模板管理。常见的国密证书模板:

模板名称密钥用法扩展密钥用法有效期适用场景
TLS 服务器digitalSignature, keyEnciphermentserverAuth1 年HTTPS 服务器
TLS 客户端digitalSignatureclientAuth1 年mTLS 双向认证
代码签名digitalSignaturecodeSigning3 年软件签名
电子邮件digitalSignature, keyEnciphermentemailProtection1 年S/MIME

四、终端实体证书签发

4.1 证书签发流程

4.2 证书签发示例

五、密钥管理系统(KMS)集成

5.1 KMS 架构

GM/T 0034-2014 第 6 章要求 CA 系统必须对接 KMS,实现密钥全生命周期管理:

CODE
┌─────────────────────────────────────────────────────────┐
│                      KMS 密钥管理系统                     │
├─────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐     │
│  │  密钥生成    │  │  密钥存储    │  │  密钥备份    │     │
│  │  (HSM 内部)  │  │  (加密存储)  │  │  (M-of-N)   │     │
│  └─────────────┘  └─────────────┘  └─────────────┘     │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐     │
│  │  密钥轮换    │  │  密钥销毁    │  │  密钥恢复    │     │
│  │  (定期自动)  │  │  (安全擦除)  │  │  (分割恢复)  │     │
│  └─────────────┘  └─────────────┘  └─────────────┘     │
└─────────────────────────────────────────────────────────┘

5.2 密钥分割备份(M-of-N)

GM/T 0034-2014 要求根 CA 私钥使用 M-of-N 分割备份,需要至少 M 个管理员中的 N 个才能恢复密钥:

运行输出:

CODE
根 CA 私钥已分割为 5 个份额(需要 3 个恢复):
  份额 1: x=1, y=0x8f3a2b1c...
  份额 2: x=2, y=0x7e4d5c6b...
  份额 3: x=3, y=0x6f5e6d7c...
  份额 4: x=4, y=0x5a6b7c8d...
  份额 5: x=5, y=0x4b7c8d9e...

恢复的秘密: a1b2c3d4e5f6a7b8...c5d4e3f
原始秘密:   a1b2c3d4e5f6a7b8...c5d4e3f
恢复结果:   PASS

六、证书吊销与 CRL

6.1 CRL 生成与验证

GM/T 0034-2014 第 8 章要求 CA 系统支持证书吊销列表(CRL):

6.2 OCSP 在线证书状态协议

除了 CRL,GM/T 0034-2014 还支持 OCSP(Online Certificate Status Protocol)实时查询证书状态:

七、国密 TLS 集成

7.1 国密双证书部署

GM/T 0034-2014 签发的证书可用于国密 TLS 部署。国密 TLS 使用双证书方案:签名证书(用于身份认证)和加密证书(用于密钥交换):

7.2 国密 TLS 库选择

库名称类型SM2 支持SM4 支持适用场景
TongsuoOpenSSL 分支✅ 原生✅ 原生服务端、高性能
BabaSSLOpenSSL 分支✅ 原生✅ 原生服务端、金融
GmSSL独立实现桌面端、工具
CuniPlus国密库嵌入式、IoT

八、合规检测与密评要点

8.1 GM/T 0034-2014 合规检查清单

根据 GM/T 0034-2014 和 GM/T 0037-2014(证书认证系统检测规范),国密 CA 系统需要满足以下要求:

检查项要求检测方法
根 CA 密钥保护私钥存储在 HSM 中,M-of-N 分割检查 HSM 配置和分割方案
密钥生成使用真随机数生成器(TRNG)检查随机数源
证书签名使用 SM2WithSM3 算法检查证书签名算法 OID
证书序列号≥ 64 位随机数检查序列号长度
有效期根 CA ≤ 25 年,中间 CA ≤ 15 年检查证书有效期
CRL 更新≤ 7 天检查 CRL 下次更新时间
密钥轮换定期轮换,旧密钥安全销毁检查轮换记录
审计日志所有操作可追溯检查日志完整性

8.2 密评常见问题

根据实战经验,国密 CA 系统在密评中常见的问题:

  • 根 CA 私钥未使用 HSM 保护:根 CA 私钥必须存储在符合 GM/T 0030-2014 要求的硬件安全模块中
  • 密钥分割方案未实施:根 CA 私钥应使用 M-of-N 分割备份,防止单点故障
  • CRL 更新周期过长:CRL 有效期不应超过 7 天,否则会被扣分
  • 证书序列号长度不足:序列号必须 ≥ 64 位(8 字节),推荐使用 128 位
  • 审计日志不完整:所有证书签发、吊销、密钥操作必须有审计日志

九、完整运行示例

以下是一个完整的国密 CA 系统运行示例:

运行输出:

运行输出:

十、踩坑记录

坑 1:gmssl 3.2.x 的 verify_with_sm3 有 bug

现象:调用 verify_with_sm3()TypeError: object of type 'NoneType' has no len()

原因:gmssl 3.2.x 的 _convert_jacb_to_nor 方法在某些情况下返回 None(当 Jacobian 坐标的 z 分量不等于 1 时),导致后续 _add_point 失败。

解决

  • 使用 Tongsuo/BabaSSL 替代 gmssl 进行验签
  • 或使用低级的 sign(message_hex, K) + verify(sig, message_hex) 组合(需自行处理 ZA 预处理)
  • 等待 gmssl 修复该 bug

坑 2:cryptography 不支持 SM2 曲线

现象from cryptography.hazmat.primitives.asymmetric import ec; ec.SM2()AttributeError

原因cryptography 46.x 支持 hashes.SM3()algorithms.SM4,但不支持 ec.SM2() 密钥生成。

解决

  • SM2 密钥操作使用 gmssl 或 Tongsuo
  • SM3 哈希和 SM4 加密使用 cryptography
  • 两者密钥格式不兼容,不能混用

坑 3:SM4-CBC 加密的 PKCS#7 填充

现象:使用 cryptographyalgorithms.SM4 + modes.CBC 加密时,如果不手动添加 PKCS#7 填充,会报 ValueError: block size is incorrect

解决:必须手动添加 PKCS#7 填充:

PYTHON
from cryptography.hazmat.primitives import padding

padder = padding.PKCS7(128).padder()
padded = padder.update(plaintext) + padder.finalize()
ct = encryptor.update(padded) + encryptor.finalize()

坑 4:HKDF salt 必须确定性

现象:使用 HKDF(salt=os.urandom(16)) 派生密钥,每次调用产生不同 salt,导致加解密使用不同密钥而解密失败。

解决:salt 必须基于 context(如字段名、表名)确定性派生:

PYTHON
import hashlib

salt = hashlib.pbkdf2_hmac("sha256", context.encode("utf-8"), b"salt", 1000)[:16]

总结

本文基于 GM/T 0034-2014 标准,从零构建了一个可运行的国密 CA 证书认证系统原型,涵盖:

  • 三层 CA 架构:根 CA(离线 HSM 保护)→ 中间 CA(在线签发)→ 终端实体证书
  • 密钥管理:SM2 密钥生成、M-of-N 分割备份、KMS 集成
  • 证书生命周期:签发、验证、吊销、CRL/OCSP
  • 国密算法集成:SM2 签名、SM3 哈希、SM4 加密
  • 合规检测:密评检查清单和常见问题
关键要点
  • 根 CA 私钥必须使用 HSM 保护,并实施 M-of-N 分割备份
  • 国密 CA 系统需要对接 KMS 实现密钥全生命周期管理
  • gmssl 3.2.x 的 verify_with_sm3 有 bug,生产环境使用 Tongsuo/BabaSSL
  • cryptography 46.x 不支持 SM2 曲线,需要 gmssl 或 Tongsuo 补充

参考来源

  • GM/T 0034-2014《基于 SM2 密码算法的证书认证系统密码及其相关安全技术规范》
  • GM/T 0037-2014《证书认证系统检测规范》
  • GM/T 0038-2014《证书认证密钥管理系统检测规范》
  • GM/T 0015-2023《数字证书格式》
  • GM/T 0010-2023《SM2 密码算法加密签名消息语法规范》
  • GB/T 39786-2021《信息安全技术 信息系统密码应用基本要求》
  • Tongsuo 项目
  • GmSSL 项目 (已归档,推荐改用 Tongsuo) ⚠️ 该仓库已归档,建议改用 Tongsuo
  • gmssl Python 库
  • cryptography 库文档

相关实践