GM/T 0015-2023《数字证书格式》标准解读:X.509 兼容框架与国密 OID 约束

标准规范 · 2026-06-06

概述

GM/T 0015-2023《数字证书格式》于 2024 年 6 月 1 日正式实施,替代 GM/T 0015-2012《基于 SM2 密码算法的数字证书格式规范》。2012 版聚焦 SM2 算法的专项约束,而 2023 版则将视野扩展为通用的数字证书格式总纲,构建了与 X.509 v3 / RFC 5280 完全兼容的框架,同时将国密算法作为框架内的一组具体参数和 OID 进行约束。

核心定位:GM/T 0015-2023 是"证书格式总纲",而非仅针对 SM2。一张 RSA 证书可以符合 2023 版的格式要求,但不能声称符合 2012 版。

标准关系

标准编号名称定位状态
GM/T 0015-2023数字证书格式通用格式总纲(X.509 v3 兼容)现行有效(2024-06-01 起)
GM/T 0015-2012基于 SM2 密码算法的数字证书格式规范SM2 专项约束被代替
GM/T 0006-2023密码应用标识规范OID 权威参考现行有效
RFC 5280Internet X.509 PKI Certificate and CRL ProfileX.509 v3 基础规范国际基准
RFC 5480Elliptic Curve Cryptography Subject Public Key InformationECC 公钥信息规范国际基准

证书基础结构

一张标准的数字证书遵循 ASN.1 DER 编码的 Certificate 结构:

CODE
Certificate ::= SEQUENCE {
    tbsCertificate       TBSCertificate,
    signatureAlgorithm   AlgorithmIdentifier,
    signatureValue       BIT STRING
}

TBSCertificate 核心字段

TBSCertificate 包含证书的所有语义信息,关键字段包括:

字段说明关键约束
version版本号有扩展项时应为 v3
serialNumber序列号正整数,同一 CA 域下唯一
issuer颁发者 DN至少含 CN、O 等属性
subject主体 DN非空,或空 Subject + critical SAN
validity有效期notBefore < notAfter,UTC 编码
subjectPublicKeyInfo主体公钥信息算法标识 + 公钥数据
extensions扩展项(v3)仅 v3 证书支持

时间编码规则

  • 2049 年及以前:使用 UTCTime(格式 YYMMDDHHMMSSZ
  • 2050 年及以后:使用 GeneralizedTime(格式 YYYYMMDDHHMMSSZ
  • 统一采用 UTC 时间

DER 编码严格性

证书合规检查不应仅停留在"能否被解析",还应确认以下 DER 编码规则:

规则说明
BIT STRING 未使用位必须为 0,否则签名值解析出错
INTEGER 最小编码正整数前不能有冗余的 0x00 前导字节
时间格式正确根据年份选择 UTCTime 或 GeneralizedTime
SET 排序SET 内元素应按标签升序排列
扩展唯一性同一 OID 的扩展在同一证书中只能出现一次

扩展项约束

证书的功能由扩展项共同定义。以下是关键扩展项的语义约束:

密钥用法(KeyUsage)— OID 2.5.29.15

最核心的限制型扩展。检查时不仅要看是否存在,还要看具体比特位是否与证书用途匹配。

证书类型预期 KeyUsage
CA 证书至少包含 keyCertSign,通常还含 cRLSign
签名类终端实体证书必须包含 digitalSignature
加密/密钥交换证书检查 keyEnciphermentdataEnciphermentkeyAgreement

基本约束(BasicConstraints)— OID 2.5.29.19

区分"能否当 CA 用"的硬性字段。带 keyCertSign 的证书,BasicConstraints.cA 必须为 TRUE。终端实体证书声明自己是 CA,或 CA 证书声明不是 CA,均为语义矛盾。

使用者密钥标识符(SKI)— OID 2.5.29.14

标识"这张证书里的公钥是谁"。CA 证书尤其重要,因为下游证书的 AKI 靠它完成链路定位。

授权密钥标识符(AKI)— OID 2.5.29.35

CA 签发的证书应包含 AKI 中的 keyIdentifier 字段,用于证书链构建。自签根证书可以例外。

证书策略(CertificatePolicies)— OID 2.5.29.32

回答"这张证书依据什么策略签发"。检查要点:策略 OID 是否可解释,是否附带 CPS 指针或用户通知。

使用者替代名称(SAN)— OID 2.5.29.17

如果主体名称仅通过 SAN 表达,则 subject 应为空序列,且 SAN 应标记为 critical。这是很多"空 Subject 证书"容易漏掉的点。

扩展密钥用法(EKU)— OID 2.5.29.37

比 KeyUsage 更贴近应用层。应联动 KeyUsage 一起看,避免逻辑冲突。

用途OID
serverAuth1.3.6.1.5.5.7.3.1
clientAuth1.3.6.1.5.5.7.3.2
codeSigning1.3.6.1.5.5.7.3.3
emailProtection1.3.6.1.5.5.7.3.4
timeStamping1.3.6.1.5.5.7.3.8

未知 critical 扩展的处理

根据 RFC 5280 第 4.2 节要求:如果证书使用方遇到无法识别的 critical 扩展,必须拒绝使用该证书。这是合规检查中容易被忽略但至关重要的安全要求。

国密 OID 体系

OID(对象标识符)是区分真假国密证书的关键。GM/T 0006-2023《密码应用标识规范》定义了完整的国密 OID 体系。

签名算法 OID

OID名称适用场景
1.2.156.10197.1.501基于 SM2 和 SM3 的签名标准 SM2+SM3 数字签名
1.2.156.10197.1.501.1基于 SM2 无证书机制和 SM3 的签名SM2 无证书签名
1.2.156.10197.1.501.2基于 SM2 隐式证书机制和 SM3 的签名SM2 隐式证书签名
1.2.156.10197.1.502基于 SM9 和 SM3 的签名SM9 IBC 签名
1.2.156.10197.1.504基于 RSA 和 SM3 的签名RSA+SM3 签名(2023 版新增)

公钥算法 OID

OID名称说明
1.2.840.10045.2.1id-ecPublicKey椭圆曲线公钥通用标识
1.2.840.113549.1.1.1rsaEncryptionRSA 公钥算法
1.2.156.10197.1.301sm2p256v1 曲线标识SM2 椭圆曲线公钥密码算法

SM2 椭圆曲线子类型 OID

OID名称
1.2.156.10197.1.301.1SM2-1 数字签名算法
1.2.156.10197.1.301.2SM2-2 密钥交换协议
1.2.156.10197.1.301.3SM2-3 公钥加密算法
1.2.156.10197.1.301.4基于 SM2 的无证书机制
1.2.156.10197.1.301.5基于 SM2 的隐式证书机制
1.2.156.10197.1.301.6基于 SM2 的协同签名机制

椭圆曲线 OID 对比(极易混淆)

OID曲线名称备注
1.2.156.10197.1.301sm2p256v1国密 SM2 曲线(真国密证书必须使用)
1.2.840.10045.3.1.7prime256v1 / P-256NIST 曲线(美国标准,不是 SM2)
关键区分1.2.840.10045.2.1(id-ecPublicKey)是"椭圆曲线公钥"的通用算法标识;1.2.156.10197.1.301(sm2p256v1)才是真正指定"用的是 SM2 曲线"的参数 OID。
>
真正区分真假国密证书的灵魂是曲线参数 OID,绝不能是 P-256 等曲线 OID。

SM2 证书专项约束

公钥点编码

SM2 证书的公钥应为非压缩椭圆曲线点编码:

CODE
04 || X (32 字节) || Y (32 字节)
  • 首字节应为 0x04(非压缩格式标识)
  • X 坐标:32 字节
  • Y 坐标:32 字节
  • 总长度:65 字节
出现 0x020x03 开头的压缩点应作为显著兼容性风险处理。

公钥点有效性验证

公钥点不仅要"长得像",还要"真在曲线上"。严格合规核查应验证:

  • X、Y 坐标在合法范围内(0 < X, Y < p)
  • 点满足 sm2p256v1 曲线方程:y² = x³ + ax + b (mod p)
  • 公钥不能是无穷远点

SM2 签名值编码

SM2 签名值应可解析为 SEQUENCE { INTEGER r, INTEGER s }

DER 编码长度分析:SM2 签名原始数据为 r、s 各 32 字节共 64 字节,经 ASN.1 DER 编码后长度在 69、70、71、72 字节之间波动。

长度原因
69 字节某一分量以 00 开头且第二字节最高位为 0,前导零被删除(32→31)
70 字节最常见,"岁月静好"型(两个 32 字节)或"互相抵消"型(33+31=64)
71 字节某一分量最高位为 1 补零(32→33),另一分量不变
72 字节r 和 s 最高位都为 1,各补一个 0x00,双双膨胀至 33 字节
重要提醒:不应硬编码 70 字节。解析逻辑应兼容四种长度。
r、s 值有效性
  • r 和 s 都必须是正整数(不能为 0)
  • DER 编码不能有冗余的前导 0x00 字节(除非是防止负数解读)

四位置 OID 检查模型

SM2 证书的 OID 检查不能只停在一个位置,必须同时核对四个层面:

检查位置检查内容预期 OID
位置一:外层签名算法Certificate.signatureAlgorithm.algorithm应为 1.2.156.10197.1.501 或其 SM2 变体
位置二:TBS 内签名算法TBSCertificate.signature.algorithm必须与位置一完全一致
位置三:SPKI 算法标识TBSCertificate.subjectPublicKeyInfo.algorithm.algorithm应为 1.2.840.10045.2.1(id-ecPublicKey)
位置四:SPKI 参数 OIDTBSCertificate.subjectPublicKeyInfo.algorithm.parameters必须为 1.2.156.10197.301(sm2p256v1)
实务中最常见的问题: - 证书签名算法看起来像 SM2/SM3,但主体公钥参数不是 SM2 曲线 - 主体公钥用了 SM2 曲线,但签名算法不是 1.2.156.10197.1.501
>
这两种情况都不应被当成标准国密证书。

分层合规检查清单

检查层级核心内容
第一层:结构/安全硬伤ASN.1 DER 结构完整、版本号、序列号、主体名称、有效期、签名算法一致性、DER 编码严格性
第二层:条件必检KeyUsage / BasicConstraints 语义一致性、AKI/SKI 链路关系、SAN 的 critical 标记、EKU 与 KU 联动
第三层:国密专项四位置 SM2 OID 检查、公钥非压缩点编码(65 字节)、公钥点在曲线上、签名值 SEQUENCE {r, s} 结构、签名值长度 69-72 字节
第四层:建议增强CertificatePolicies 策略体系、NameConstraints(复杂 CA 体系)、策略映射和限制

参考来源

  • GM/T 0015-2023《数字证书格式》(2024-06-01 实施)
  • GM/T 0015-2012《基于 SM2 密码算法的数字证书格式规范》(被代替)
  • GM/T 0006-2023《密码应用标识规范》
  • GB/T 20518-2006《信息安全技术 公钥基础设施 数字证书格式》
  • RFC 5280 — Internet X.509 PKI Certificate and CRL Profile
  • RFC 5480 — Elliptic Curve Cryptography Subject Public Key Information
  • GM/T 0002-2012《SM2 椭圆曲线公钥密码算法》
  • GM/T 0003.2-2012《SM2 第 2 部分:数字签名算法》

相关实践