一、数字证书的组成

1)证书数据结构

数字证书使用ASN.1编码,证书文件以二进制或Base64格式存放,数据格式使用TLV(Tag Length Value)形式,T代表类型标识符,L是长度值标识符,V代表值编码。数字证书中的每一项都有个对应的类型T。一个数字证书就是一个大的TLV序列,然后V又由多个TLV组合而成。

SM2证书数据和RSA算法证书一样,包含证书版本、序列号、颁发者、使用者主体信息、使用者公钥、有效期、证书扩展项等,只不过SM2证书的公钥算法是使用ECC算法的Oid标识(1.2.840.10045.2.1),然后公钥参数使用SM2国密算法的Oid标识(1.2.156.10197.1.301)。

2)签名算法

SM2证书配套的签名算法是基于SM3的SM2签名算法,算法Oid标识为1.2.156.10197.1.501,另外SM2国密算法还定义基于SHA_1、SHA_256的签名,以及使用SM3算法的RSA的签名,只不过签名算法Oid标识不一样。

3)签名数据

SM2的签名数据由2个BigInteger大数组成,再使用Der编码存放签名数据。证书的签名数据由根证书私钥进行签名,使用根证书公钥验证,顶级根证书使用自己的证书公钥验证。

二、数字证书的对象标识符

数字证书的每项都有对象标识Oid,SM2数字证书的主要区别就是公钥算法、公钥参数、签名算法标识不一样,其余的都是X509里标准项。数字证书常见得对象标识有如下:


对象标识符

名称

OID

rsaEncryption

RSA算法标识

1.2.840.113549.1.1.1

sha1withRSAEncryption

SHA1的RSA签名

1.2.840.113549.1.1.5

ECC

ECC算法标识

1.2.840.10045.2.1

SM2

SM2算法标识

1.2.156.10197.1.301

SM3WithSM2

SM3的SM2签名

1.2.156.10197.1.501

sha1withSM2

SHA1的SM2签名

1.2.156.10197.1.502

sha256withSM2

SHA256的SM2签名

1.2.156.10197.1.503

sm3withRSAEncryption

SM3的RSA签名

1.2.156.10197.1.504

commonName

主体名

2.5.4.3

emailAddress

邮箱

1.2.840.113549.1.9.1

cRLDistributionPoints

CRL分发点

2.5.29.31

extKeyUsage

扩展密钥用法

2.5.29.37

subjectAltName

使用者备用名称

2.5.29.17

CP

证书策略

2.5.29.32

clientAuth

客户端认证

1.3.6.1.5.5.7.3.2


三、数字证书的解析

数字证书的解析主要是根据ASN.1语法和对象标识符来获取值,然后再是证书的有效期、颁发机构根证书、CRL吊销状态和使用目的等验证。RSA证书是标准算法大部分平台都可以解析,而SM2国密算法证书的解析就不是那么通用的。在Windows的一些较高版本打开SM2证书会显示“验证信任关系时,系统层上出现了一个错误”,这是因为Windows还不支持SM2算法证书验证,不能识别SM2签名的算法标识,因此需要自行验证SM2证书的签名数据,可基于BouncyCastle开源加密库来实现SM2验证签名,详细参见我的国密算法SM2证书制作