文章总结: 该文档系统阐述了基于GM/T0015-2023标准的数字证书合规检查框架,涵盖标准版本关系、证书基础结构检查、扩展项验证及国密算法OID核验等关键环节。核心要求包括先按X.509v3通用结构检查再叠加国密专项检查,重点涉及DER编码严格性、扩展项逻辑一致性及SM2证书四层OID匹配。文档提供了可操作的检查清单与算法标识对照表,强调曲线参数OID是区分真伪国密证书的关键依据。 综合评分: 87 文章分类: 技术标准,安全建设,数据安全,应用安全,网络安全
基于 GM/T 0015 的数字证书完整合规检查项
原创
利刃信安 利刃信安
利刃信安
2026年5月14日 11:21 北京
在小说阅读器读本章
去阅读
基于 GM/T 0015 的数字证书完整合规检查项
标准版本说明:GM/T 0015-2023《数字证书格式》已于2024年6月1日正式实施,并明确代替GM/T 0015-2012。本文件以2023版为唯一有效标准,同时保留2012版作为理解国密SM2证书专项要求的参考背景。GM/T 0015-2012的正式名称为《基于SM2密码算法的数字证书格式规范》,仅聚焦SM2算法;GM/T 0015-2023是《数字证书格式》总纲,构建了与X.509 v3/PKIX完全兼容的框架,并将SM2/SM3算法作为框架内的一组具体参数和OID进行约束。
一、标准关系与检查逻辑
GM/T 0015-2023可以视为”证书格式总纲”,而GM/T 0015-2012更像”SM2证书的早期专项画像”。实践中最稳妥的做法是:先按通用X.509 v3/PKIX结构检查,再叠加国密算法检查。
一张RSA证书完全可以符合GM/T 0015-2023的格式要求,但不能声称符合2012版。
1.1 通用格式要求(所有证书必检)
- • 证书整体必须是ASN.1 DER编码的
Certificate ::= SEQUENCE { tbsCertificate, signatureAlgorithm, signatureValue }结构 - •
TBSCertificate内的版本、序列号、颁发者、主体、有效期、主体公钥信息、扩展项等字段必须语义完整 - • 扩展项必须遵守”一个扩展OID在同一证书中只能出现一次”的规则
- • 无法识别的critical扩展,证书使用方必须拒绝
1.2 SM2/SM3体系专项检查(仅当证书声明采用SM2/SM3时执行)
- • 签名算法OID是否在标准SM2/SM3 OID集合内
- • 主体公钥是否为椭圆曲线公钥,曲线是否落在
sm2p256v1 - • 公钥点是否采用非压缩编码,首字节
04,后跟32字节X与32字节Y - • 签名值是否可被正确解析为
SEQUENCE { INTEGER r, INTEGER s }
二、证书基础结构检查
这是”任何一张数字证书都绕不过去的骨架检查”。骨架出问题,后面的OID再漂亮也没有意义。
2.1 版本号(version)
面向实际PKI使用的证书,通常应为v3,因为关键扩展如KeyUsage、BasicConstraints、SKI、AKI 都依赖v3承载。若证书需要表达这些扩展却仍不是v3,直接判定为不合规或不可用。
2.2 序列号(serialNumber)
必须是正整数,并且在同一CA域下保持唯一。序列号不是”随便填个数字”,它直接影响吊销、链路定位与审计。
2.3 颁发者与主体名称(issuer/subject)
这两部分都属于Name,应由DN属性集构成。至少要关注属性是否完整、是否为空、编码是否规范。
常见名称OID:
| 属性 | OID | | — | — | | CN | 2.5.4.3 | | O | 2.5.4.10 | | OU | 2.5.4.11 | | C | 2.5.4.6 | | ST | 2.5.4.8 | | L | 2.5.4.7 | | serialNumber | 2.5.4.5 |
2.4 有效期(validity)
notBefore必须早于notAfter。在编码形式上,应遵循2049年及以前使用UTCTime、2050年及以后使用GeneralizedTime 的规则,并统一采用UTC表达。
2.5 主体公钥信息(SubjectPublicKeyInfo)
这里要同时看三件事:公钥算法、算法参数、真正的公钥比特串。很多证书”表面能解析”,但恰恰是在这个位置埋了不兼容隐患。
2.6 签名算法字段前后一致
证书外层的signatureAlgorithm与TBSCertificate.signature应保持一致。若这两个位置不一致,即使某些库还能勉强解析,也应视为高风险异常。
2.7 DER编码严格性
合规检查不应只停留在”能否被解析”。还应确认是否遵守DER最简编码原则:
- • BIT STRING未使用位:必须为
0。外层BIT STRING的unused bits若非0,签名值解析会出错。 - • INTEGER最小编码:正整数前不能有冗余的
0x00前导字节。 - • 时间格式:必须使用正确的时间类型(UTCTime vs GeneralizedTime)。
- • SEQUENCE/SET排序:SET内元素应按标签升序排列。
- • 扩展唯一性:同一OID的扩展在同一证书中只能出现一次。
三、扩展项检查
一张证书能不能拿来签名、能不能发下级证书、能不能做TLS服务端认证,核心并不由”标题”决定,而是由扩展项共同决定。
3.1 密钥用法(KeyUsage),OID:2.5.29.15
这是最核心的限制型扩展之一。检查时不仅要看有没有,还要看具体比特位是否与证书用途匹配。
| 证书类型 | 预期KeyUsage |
| — | — |
| CA证书 | 至少包含keyCertSign,通常还应包含cRLSign |
| 签名类终端实体证书 | 至少包含digitalSignature |
| 加密/密钥交换用途证书 | 检查keyEncipherment、dataEncipherment、keyAgreement |
注意:在
cryptography库中,encipher_only和decipher_only属性仅当key_agreement=True时才存在,访问前必须确认key_agreement标志。
3.2 基本约束(BasicConstraints),OID:2.5.29.19
这是区分”能不能当CA用”的硬性字段。凡是带keyCertSign的证书,BasicConstraints.cA就必须为TRUE 。如果是一张终端实体证书却声明自己是CA,或者反过来,就属于结构语义矛盾。
3.3 使用者密钥标识符(SubjectKeyIdentifier),OID:2.5.29.14
它用于标识”这张证书里的公钥是谁”。对于CA证书尤其重要,因为下游证书的AKI往往要靠它来完成链路定位。
3.4 授权密钥标识符(AuthorityKeyIdentifier),OID:2.5.29.35
GM/T 0015-2023对AKI的态度非常明确:CA签发的证书都应包含AKI中的keyIdentifier字段 ,以便进行证书链构建。自签根证书可以例外,但一旦进入层级签发场景,就不应缺失。
3.5 证书策略(CertificatePolicies),OID:2.5.29.32
它负责回答”这张证书依据什么策略签发、用于什么治理框架”。合规检查时至少要看三点:有没有策略OID、策略OID是否可解释、是否需要附带CPS指针或用户通知。
3.6 使用者替代名称(SubjectAltName),OID:2.5.29.17
如果主体名称不直接放在subject,而是仅通过SAN表达,那么subject应为空序列,且SAN应标记为critical 。这条在2023版中说得很清楚,也是很多”空Subject证书”最容易漏掉的点。
3.7 扩展密钥用法(ExtendedKeyUsage),OID:2.5.29.37
它比KeyUsage更贴近应用层。检查时应联动KeyUsage一起看,避免出现”EKU说能做服务器认证,但KU却没给出对应能力”的逻辑冲突。
常见EKU OID:
| 用途 | OID | | — | — | | serverAuth | 1.3.6.1.5.5.7.3.1 | | clientAuth | 1.3.6.1.5.5.7.3.2 | | codeSigning | 1.3.6.1.5.5.7.3.3 | | emailProtection | 1.3.6.1.5.5.7.3.4 | | timeStamping | 1.3.6.1.5.5.7.3.8 |
3.8 吊销相关扩展
| 扩展 | OID | | — | — | | CRLDistributionPoints | 2.5.29.31 | | AuthorityInfoAccess | 1.3.6.1.5.5.7.1.1 |
其中AIA常与OCSP、CA Issuers地址联动检查:
| 访问方法 | OID | | — | — | | id-ad-ocsp | 1.3.6.1.5.5.7.48.1 | | id-ad-caIssuers | 1.3.6.1.5.5.7.48.2 |
3.9 未知critical扩展
根据RFC 5280 §4.2的要求:如果证书使用方遇到无法识别的critical扩展,必须拒绝使用该证书。这是合规检查中容易被忽略但至关重要的安全要求。
四、OID检查——国密证书核查的核心
国密证书最常见的误判,就是只看UI展示的”SM2″”SM3″字样,却没有深入到ASN.1里的对象标识符。真正可靠的合规判断,应该回到OID级别。
4.1 核心OID清单(基于GM/T 0006-2023 §8.2)
4.1.1 签名算法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版新增) | | 1.2.840.113549.1.1.11 | sha256WithRSAEncryption | RSA+SHA256签名(对照参考) |
4.1.2 公钥算法OID
| OID | 名称 | 说明 | | — | — | — | | 1.2.840.10045.2.1 | id-ecPublicKey | 椭圆曲线公钥的通用算法标识(非SM2专用) | | 1.2.840.113549.1.1.1 | rsaEncryption | RSA公钥算法 | | 1.2.156.10197.1.301 | sm2p256v1曲线标识 | SM2椭圆曲线公钥密码算法 |
4.1.3 SM2椭圆曲线子类型OID(GM/T 0006-2023 §8.2.3)
| OID | 名称 | | — | — | | 1.2.156.10197.1.301.1 | SM2-1 数字签名算法 | | 1.2.156.10197.1.301.2 | SM2-2 密钥交换协议 | | 1.2.156.10197.1.301.3 | SM2-3 公钥加密算法 | | 1.2.156.10197.1.301.4 | 基于SM2算法的无证书机制 | | 1.2.156.10197.1.301.4.1 | 无证书机制的签名机制 | | 1.2.156.10197.1.301.4.2 | 无证书机制的加密机制 | | 1.2.156.10197.1.301.5 | 基于SM2算法的隐式证书机制 | | 1.2.156.10197.1.301.5.1 | 隐式证书机制的签名机制 | | 1.2.156.10197.1.301.5.2 | 隐式证书机制的加密机制 | | 1.2.156.10197.1.301.6 | 基于SM2算法的协同签名机制 | | 1.2.156.10197.1.301.6.1 | 协同签名机制的签名 | | 1.2.156.10197.1.301.6.2 | 协同签名机制的加密 |
4.1.4 SM9 IBC密码算法OID(GM/T 0006-2023 §8.2.3)
| OID | 名称 | | — | — | | 1.2.156.10197.1.302 | SM9 IBC密码算法 | | 1.2.156.10197.1.302.1 | SM9 IBC签名算法 | | 1.2.156.10197.1.302.2 | SM9 IBC密钥交换协议 | | 1.2.156.10197.1.302.3 | SM9 IBC加密算法 | | 1.2.156.10197.1.302.4 | SM9 IBC密钥封装机制 | | 1.2.156.10197.1.302.5 | 基于SM9算法的协同签名机制 |
注意:SM9 IBC系统证书不在GM/T 0015-2012的覆盖范围内。GM/T 0015-2023作为通用格式标准,可以容纳SM9 IBC证书,但具体的SM9算法标识应参考GM/T 0006-2023的完整OID定义。
4.1.5 椭圆曲线OID对比(极易混淆)
| OID | 曲线名称 | 备注 | | — | — | — | | 1.2.156.10197.1.301 | sm2p256v1 | 国密SM2曲线 ,这是真国密证书必须使用的曲线 | | 1.2.840.10045.3.1.7 | prime256v1 / P-256 | NIST曲线,这是美国NIST标准曲线,不是SM2 |
关键区分:
1.2.840.10045.2.1(id-ecPublicKey)是”椭圆曲线公钥”的通用算法标识,用于声明”这是一把ECC公钥”;而1.2.156.10197.1.301(sm2p256v1)才是真正指定”用的是SM2曲线”的曲线参数OID。真正区分真假国密证书的灵魂是曲线参数OID,绝不能是P-256等曲线OID。
4.2 SM2证书的四位置OID检查
SM2证书的OID检查不能只停在一个位置,必须同时核对四个层面:
| 检查位置 | 检查内容 | 预期OID |
| — | — | — |
| 位置一:外层签名算法 | Certificate.signatureAlgorithm.algorithm | 应为1.2.156.10197.1.501或其SM2变体OID |
| 位置二:TBS内签名算法 | TBSCertificate.signature.algorithm | 必须与位置一完全一致 |
| 位置三:SPKI算法标识 | TBSCertificate.subjectPublicKeyInfo.algorithm.algorithm | 应为1.2.840.10045.2.1(id-ecPublicKey) |
| 位置四:SPKI参数OID | TBSCertificate.subjectPublicKeyInfo.algorithm.parameters | 必须为1.2.156.10197.1.301(sm2p256v1) |
实务中最常见的问题:
- • 证书签名算法看起来像SM2/SM3,但主体公钥参数却不是SM2曲线
- • 或者反过来,主体公钥用了SM2曲线,但签名算法却不是
1.2.156.10197.1.501这两种情况都不应被当成”标准国密证书”。
4.3 RSA证书的OID检查
当证书使用RSA算法时,应检查签名算法与公钥算法的匹配性:
| 检查项 | OID | 说明 | | — | — | — | | RSA公钥算法 | 1.2.840.113549.1.1.1 | 必须为rsaEncryption | | RSA+SHA256签名 | 1.2.840.113549.1.1.11 | sha256WithRSAEncryption | | RSA+SM3签名 | 1.2.156.10197.1.504 | 新增于2023版,GM/T 0006-2023 §8.2.5 |
五、SM2证书专项约束
这是全文最容易被漏检的部分。真正把GM/T 0015-2012与2023版一起吃透之后,会发现”SM2专项检查”并不是简单地看一眼OID,而是要落到公钥、签名值与编码细节。
5.1 公钥点编码检查
对SM2证书而言,subjectPublicKey通常应为非压缩椭圆曲线点编码:
04 || X(32字节) || Y(32字节)
- • 首字节应为
0x04(非压缩格式标识) - • X坐标:32字节
- • Y坐标:32字节
- • 总长度:65字节
若出现0x02或0x03开头的压缩点,至少应作为显著兼容性风险处理。
5.2 公钥点有效性验证
公钥点不仅要”长得像”,还要”真在曲线上”。严格的合规核查还应验证:
- • X、Y坐标是否在合法范围内(0 < X,Y < p,其中p为SM2曲线阶)
- • 点是否满足
sm2p256v1的曲线方程:y² = x³ + ax + b (mod p) - • 公钥不能是SM2曲线的无穷远点
否则就可能出现”编码长度看起来没问题,但点根本无效”的伪合规证书。
5.3 SM2签名值编码检查
SM2签名值应可解析为SEQUENCE { INTEGER r, INTEGER s }。从标准合规角度,还应核查:
5.3.1 BIT STRING未使用位
外层BIT STRING的unused bits必须为0。若非0,签名值解析会出错。
5.3.2 签名值长度分析
SM2签名(r,s各32字节共64字节原始数据)经过ASN.1 DER编码后,长度不是固定的70字节,而是可能在69、70、71、72字节 之间波动。这是因为DER编码对整数的三条规则:
| 规则 | 说明 |
| — | — |
| 必须最短表示 | 冗余前导0x00必须删除 |
| 最高位为1需补零 | 若整数首字节最高位为1,强制补0x00防止被解析为负数 |
| 特殊情况的薛定谔零 | 若首字节恰好是0x00,需看第二字节最高位决定删或留 |
DER INTEGER编码结果导致SM2签名出现四种长度:
| 长度 | 原因 |
| — | — |
| 69字节 | 某一分量以00开头且第二字节最高位为0,前导00被判定为冗余删除(32→31) |
| 70字节 | 最常见。”岁月静好”型(两个32字节)或”互相抵消”型(一个33+一个31=64) |
| 71字节 | 某一分量最高位为1补零(32→33),另一分量不变,总内容65字节 |
| 72字节 | r和s的最高位都为1,各补一个0x00,双双膨胀至33字节 |
重要提醒:别再硬编码70字节了。写个兼容的解析逻辑,四种长度全接住。
5.3.3 r、s值的有效性
- •
r和s都必须是正整数(不能为0) - • DER编码不能有冗余的前导
0x00字节(除非是防止负数解读的”护身符”)
六、完整合规检查清单
6.1 分层检查表
| 检查层级 | 检查项 | 判定标准 |
| — | — | — |
| 第一层:必检项 结构/安全硬伤 | 证书整体ASN.1 DER结构完整 | Certificate/TBSCertificate结构无缺失,DER可严格解析 |
| | 版本号 | 承载关键扩展时应为v3 |
| | 序列号 | 正整数、唯一、无异常编码 |
| | 主体名称 | 非空或符合”空Subject+critical SAN”规则 |
| | 有效期 | notBefore < notAfter,时间类型与年份匹配 |
| | 签名算法一致性 | 外层与TBS内算法标识完全一致 |
| | DER编码严格性 | BIT STRING unused bits=0,INTEGER最小编码,时间格式正确 |
| 第二层:条件必检 与用途/算法强相关 | KeyUsage/BasicConstraints | CA与终端实体身份定义不矛盾 |
| | AKI/SKI | CA签发场景下AKI的keyIdentifier存在,链路关系可解释 |
| | SAN | TLS、邮箱、空Subject等场景必须critical |
| | EKU与KU联动 | EKU声明的用途必须在KeyUsage中有对应比特位 |
| | CRLDP/AIA | 公开验证、状态查询或证书下载场景应具备 |
| 第三层:国密专项 声明为SM2时强制执行 | 四位置SM2 OID检查 | 外层签名、TBS签名、SPKI算法、SPKI参数四个位置的OID全部正确 |
| | 公钥非压缩点编码 | 首字节0x04,总长65字节(32+32+1) |
| | 公钥点在曲线上 | 满足sm2p256v1曲线方程 |
| | 签名值结构 | 可解析为SEQUENCE { r, s } |
| | 签名值长度 | 69/70/71/72字节均为合规 |
| | BIT STRING unused bits | 必须为0 |
| 第四层:建议增强 严格PKI体系 | CertificatePolicies | 策略OID清晰,CP/CPS体系明确 |
| | NameConstraints | 适合层级复杂的CA体系 |
| | PolicyMappings/PolicyConstraints | 策略映射和策略限制的语义一致性 |
6.2 典型合规/不合规示例
示例1:格式合格的SM2终端实体证书
version = v3
signatureAlgorithm = 1.2.156.10197.1.501
subjectPublicKeyInfo.algorithm = 1.2.840.10045.2.1
subjectPublicKeyInfo.parameters = 1.2.156.10197.1.301
keyUsage = digitalSignature
extendedKeyUsage = serverAuth
basicConstraints = CA:FALSE
subjectAltName = DNS:www.example.cn
这种证书在结构层、OID层、用途层都比较一致,通常可视为”格式上合格的SM2终端实体证书”。
示例2:看似”国密”,实为P-256曲线(不合规)
signatureAlgorithm = 1.2.156.10197.1.501
subjectPublicKeyInfo.algorithm = 1.2.840.10045.2.1
subjectPublicKeyInfo.parameters = 1.2.840.10045.3.1.7 ← P-256,不是sm2p256v1
这里的曲线参数1.2.840.10045.3.1.7对应的是prime256v1/P-256,不是sm2p256v1。这不是一张标准意义上的SM2曲线证书,至少不能直接按GM/T 0015的SM2证书来认定。
示例3:RSA证书(仅符合2023版通用格式)
signatureAlgorithm = 1.2.840.113549.1.1.11
subjectPublicKeyInfo.algorithm = 1.2.840.113549.1.1.1
basicConstraints = CA:TRUE
keyUsage = keyCertSign, cRLSign
这张证书在2023版”数字证书格式” 的讨论框架下完全可以被分析,因为它同样遵守X.509结构、扩展和OID规则;但它显然不是2012版所强调的”基于SM2密码算法的数字证书”。
七、核心结论
GM/T 0015-2012与GM/T 0015-2023共同回答的是同一个问题:一张数字证书,到底应该如何被规范地表示、理解与验证 。其中,2012版偏向SM2专项约束,2023版则把视野扩展到更完整的数字证书格式体系。
真正完整的合规检查,至少应覆盖四层:
| 层级 | 核心内容 | | — | — | | 结构层 | ASN.1 DER结构完整性、字段语义正确 | | 扩展层 | KeyUsage、BasicConstraints、AKI/SKI、SAN等扩展的语义一致性 | | 编码层 | DER最简编码、BIT STRING unused bits、INTEGER最小编码、时间格式 | | OID层 | 算法标识、曲线参数、扩展OID的正确性 |
而你最需要盯紧的,往往恰恰是很多文章一笔带过的那部分:对象标识符、曲线参数和签名值编码。
一句话总结:判断一张证书是否符合GM/T 0015,不应只看”是不是SM2″,而应同时检查X.509基础结构、关键扩展约束、DER编码规范,以及最关键的算法与扩展OID。
算法与曲线的OID是决不允许失守的底线。
参考标准
| 标准编号 | 名称 | 说明 | | — | — | — | | GM/T 0015-2023 | 数字证书格式 | 当前有效标准,2024-06-01实施 | | GM/T 0015-2012 | 基于SM2密码算法的数字证书格式规范 | 被代替,作为SM2专项参考 | | GM/T 0006-2023 | 密码应用标识规范 | OID权威参考 | | RFC 5280 | Internet X.509 PKI Certificate and CRL Profile | X.509 v3基础规范 | | RFC 5480 | Elliptic Curve Cryptography Subject Public Key Information | ECC公钥信息规范 |
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:利刃信安 利刃信安 利刃信安《基于 GM/T 0015 的数字证书完整合规检查项》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论