国密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混用:签名证书用于加密,加密网关处理业务报错