国密SM2证书完整有效性验证方案
覆盖4类验证场景:本地文件校验、CSR与证书匹配、证书链信任校验、TLS国密链路实测、合规密评校验,全部基于GmSSL/GMSSL工具,适配GM/T 0015、GM/T 0092标准。
一、前置基础说明
国密证书核心校验点和RSA证书完全不同,必须额外校验:
1. 公钥算法:SM2(曲线sm2p256v1)
2. 签名摘要:SM3,签名算法`sm2-with-sm3`
3. SM2 UserID一致性(默认`1234567812345678`)
4. 国密专用扩展OID:`1.2.156.10197.1.301`
5. 密钥用途区分:签名证书/加密证书不可混用
6. 证书链全部为国密算法,禁止RSA根证书签发SM2业务证书
一、本地单张证书基础合法性校验(gmssl命令)
1. 查看证书完整信息(算法、DN、扩展、有效期)
bash
gmssl x509 -in server.crt -text -noout
重点核对输出内容:
1. Public Key Algorithm:必须 `sm2p256v1`
2. Signature Algorithm:`sm2-with-sm3`
3. Validity:`Not Before / Not After` 当前时间在区间内,证书未过期
4. Subject DN:C=CN,无中文、特殊符号,符合CSR填写规范
5. 存在扩展:`1.2.156.10197.1.301`(国密标识)
6. Key Usage:
签名证书:`Digital Signature, Non Repudiation`
加密证书:`Key Encipherment, Data Encipherment, Key Agreement`
7. Subject Alternative Name(SAN):域名/IP与业务匹配
2. 校验证书自身签名合法性(自签/CA签发证书通用)
校验证书签发者(Issuer)私钥对当前证书的签名是否有效,防止篡改:
bash
方式1:直接校验单证书自签名
gmssl x509 -in server.crt -verify -noout
方式2:使用根CA公钥校验业务证书(生产环境必做)
gmssl verify -CAfile gm_root.crt server.crt
输出 `OK` = 签名合法;输出错误 = 证书被篡改、根证书不匹配。
3. 校验SM2 UserID一致性(极易踩坑)
SM2验签依赖Z值,UserID不统一会导致业务加密/签名全部失败:
bash
提取证书公钥,使用标准UserID校验
gmssl sm2 -pubin -in server_pub.key -userid "1234567812345678"
项目内所有组件(网关、加密机、后端代码、CA)UserID必须完全一致。
4. 校验证书与私钥是否配对(私钥未丢失、未错配)
分别计算私钥、证书公钥摘要,对比是否相同:
bash
1. 输出私钥公钥摘要
gmssl pkey -in sign.key -pubout -out pub.tmp
gmssl md5 pub.tmp
2. 提取证书内公钥并摘要
gmssl x509 -in server.crt -pubkey -out crt_pub.tmp
gmssl md5 crt_pub.tmp
两段MD5值一致 → 私钥与证书匹配;不一致则证书无法解密TLS流量。
5. CSR与证书一致性校验
确认CA签发证书使用了你本地生成的CSR,无篡改DN/SAN:
bash
提取证书主体信息
gmssl x509 -in server.crt -subject -noout
# 提取CSR主体信息
gmssl req -in server.csr -subject -noout
两段DN、SAN扩展必须完全一致,否则CA签发时篡改了申请信息,密评不通过。
二、国密证书链完整信任校验(生产环境核心)
业务证书→二级CA→根CA,整条链路必须全SM2算法,不能混合RSA。
1. 拼接证书链并校验
bash
拼接链:业务证书 + 二级CA
cat server.crt subca.crt > chain.pem
使用根证书完整校验整条链
gmssl verify -CAfile gm_root.crt -untrusted chain.pem server.crt
输出 `OK` 代表整条证书链可信、层级合法。
链校验必查项
1. 每一级证书签名算法均为`sm2-with-sm3`
2. BasicConstraints:根CA=CA:TRUE,业务证书=CA:FALSE
3. 上级证书密钥用途包含`Certificate Sign`(允许签发下级证书)
4. 无证书过期、无吊销(需配合CRL/OCSP校验)
2. 证书吊销校验(等保/密评强制)
方式1:CRL吊销列表校验
bash
gmssl crl -in gm_ca.crl -text -noout
校验证书是否在吊销列表中
gmssl verify -CAfile gm_root.crt -CRLfile gm_ca.crl -crl_check server.crt
方式2:国密OCSP在线校验
bash
gmssl ocsp -issuer subca.crt -cert server.crt -url http://ocsp.gmca.com
返回`good`=证书正常;`revoked`=证书已吊销禁止使用。
三、实测国密HTTPS/TLS证书有效性(业务链路验证)
验证服务端是否正常启用国密TLS、证书正常握手,使用gmssl s_client:
bash
访问国密HTTPS站点,加载根证书信任链
gmssl s_client -connect api.xxx.com:443 -CAfile gm_root.crt -gmssl
成功标准:
1. 握手协议为 `GMSSLv1.1/GMSSLv1.2`(国密TLS)
2. 密码套件以`SM2`/`SM3`/`SM4`开头,如`ECC-SM2-WITH-SM4-SM3`
3. 输出 `Verify return code: 0 (ok)` 代表证书信任合法
4. 同时打印服务端签名证书、加密证书两套证书(双证书模式)
常见失败:
仅返回RSA套件:服务端未配置国密双证书
Verify非0:根证书未导入、证书链缺失、证书过期/吊销
四、密评合规专项校验(密码测评必查项)
除合法性外,密评会额外校验国密合规标识,缺一不可:
1. 证书公钥算法必须SM2,禁止RSA/ECC国际算法
2. 所有证书签名算法必须sm2-with-sm3,禁止SHA256
3. 证书扩展包含国密OID `1.2.156.10197.1.301`
4. 双证书场景签名/加密证书keyUsage严格分离,不可混用
5. 私钥本地自持,不允许第三方平台托管(可核对CSR生成方式)
6. 存在CRL/OCSP吊销机制,可正常校验证书状态
7. SAN扩展包含全部业务域名、内网IP,无域名缺失告警
一键合规检查脚本命令(汇总校验):
bash
gmssl x509 -in server.crt -text -noout | grep -E "sm2p256v1|sm2-with-sm3|1.2.156.10197.1.301|Not After"
五、编程语言代码层验证(开发集成校验)
Java(GMSSL-Java/BC国密库)
1. 读取X509Certificate,获取公钥判断实例为SM2PublicKey
2. 调用`checkValidity()`校验有效期
3. 使用CA公钥执行`verify(cert.getSignature())`校验签名
4. 解析KeyUsage区分签名/加密证书
Python(gmssl-python)
python
from gmssl import sm2, x509
加载证书
cert = x509.load_cert("server.crt")
有效期校验
cert.check_validity()
使用根公钥验签
root_cert = x509.load_cert("gm_root.crt")
cert.verify(root_cert.get_pubkey())
六、常见验证失败原因汇总
1. 签名算法是sha256:非国密证书,不符合商密改造要求
2. verify返回error:证书篡改、根证书不匹配、证书链断裂
3. 公私钥不匹配:部署时上传错误证书/私钥
4. UserID不一致:证书合法但业务签名验签报错
5. 证书已过期:Not After早于当前时间,直接失效
6. 证书被吊销:CRL/OCSP查询revoked,禁止业务使用
7. 缺少SAN域名:浏览器告警、TLS握手失败
8. keyUsage混用:签名证书用于加密,加密网关处理业务报错