X509证书结构解析

X509证书是采用DER编码的ASN1结构数据:

Certificate::=SEQUENCE{

tbsCertificate TBSCertificate,

signatureAlgorithm AlgorithmIdentifier,

signatureValue BIT STRING

}

整体X509证书是SEQUENCE类型,包括三个元素。其中,tbsCertificate是证书数据本身, TBSCertificate类型,是整个X509证书数据的主体。所谓”TBS”就是“To be signed”的缩写,tbsCertificate的意思就是“要被签名的证书内容”。因为在前面的文章讲过,每张证书都是被上一级证书对应的私钥签过名的(顶级证书是自签名);signatureAlgorithm就是所使用的的签名算法标识;signatureValue就是签名结果。

建议使用一些ASN1解析工具,打开一个证书cer文件,对照实例学习。我这里用的是Asn1Editor,打开证书文件效果如下:
在这里插入图片描述

下面介绍一下各个元素。第一个是tbsCertificate,TBSCertificate类型,其结构定义如下。

TBSCertificate::=SEQUENCE{

version [0] EXPLICIT Version DEFAULT v1,

serialNumber CertificateSerialNumber,

signature AlgorithmIdentifier,

issuer Name,

validity Validity,

subject Name,

subjectPublicKeyInfo SubjectPublicKeyInfo,

issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,

subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,

extensions [3] EXPLICIT Extensions OPTIONAL

}

TBSCertificate同样是SEQUENCE,其各个元素说明如下:

  • version
    证书的版本号,Version类型,其定义如下:

Version ::= INTEGER { v1(0), v2(1), v3(2) }

version的默认值是V1,但实际上现在使用的证书基本是V2或V3版本。由于Tag标记为[0] EXPLICIT,所以版本号如果没有被省略,编码时会在它外面加一个新的标识。如下图,可见此证书的版本是V3:

在这里插入图片描述

  • serialNumber
    证书的序列号,CertificateSerialNumber类型,即INTEGER类型。

CertificateSerialNumber ::= INTEGER

  • signature
    虽然名字叫”signature”,它实际上是证书进行签名时的算法标识,AlgorithmIdentifier类型,定义如下:

AlgorithmIdentifier ::= SEQUENCE {

algorithm OBJECT IDENTIFIER,

parameters ANY DEFINED BY algorithm OPTIONAL

}

下图可以看出,此证书的签名算法标识是‘’1.2.156.10197.1.501”,也就是使用SM2和SM3的签名算法。
在这里插入图片描述

  • issuer
    证书颁发者信息,Name类型,相关类型定义如下:

Name ::= CHOICE {

RDNSequence }

RDNSequence ::= SEQUENCE OF RelativeDistinguishedName

RelativeDistinguishedName ::=SET OF AttributeTypeAndValue

AttributeTypeAndValue ::= SEQUENCE {

type AttributeType,

value AttributeValue }

AttributeType ::= OBJECT IDENTIFIER

AttributeValue ::= ANY DEFINED BY AttributeType

本文中的证书颁发者包含三个信息:所在国别(countryName),颁发机构名称(organizationName)和通用名称(commonName)。

在这里插入图片描述

  • validity
    证书有效期,Validity类型

Validity ::= SEQUENCE {

notBefore Time, – 证书有效期起始时间

notAfter Time – 证书有效期终止时间

}

Time ::= CHOICE {

utcTime UTCTime,

generalTime GeneralizedTime }

从上图可以看出,本文证书有效期起始和终止时间是UTCTime类型,长度5年。

  • subject
    证书持有人(主体)信息。本文证书包含国别,所在省(stateOrProviceName),地址(localityName),机构名称和通用名称等持有人信息。
  • subjectPublicKeyInfo
    证书公钥信息,SubjectPublicKeyInfo类型,定义如下:

SubjectPublicKeyInfo ::= SEQUENCE {

algorithm AlgorithmIdentifier, – 公钥算法

subjectPublicKey BIT STRING – 公钥值

}

本证书algorithm的算法标识是ecPublicJKey,说明使用ECC算法,第二个OBJECT IDENTIFIER是参数,具体说明是采用基于ECC算法的SM2算法。

在这里插入图片描述

  • issuerUniqueID
    证书颁发者ID,UniqueIdentifier类型,可选。本证书里不包括。

UniqueIdentifier ::= BIT STRING

  • subjectUniqueID
    证书持有人ID,UniqueIdentifier类型,可选。本证书里不包括。
  • extensions
    证书扩展字段,Extensions类型,可选。

Extensions ::= SEQUENCE SIZE (1…MAX) OF Extension

Extension ::= SEQUENCE {

extnID OBJECT IDENTIFIER,

critical BOOLEAN DEFAULT FALSE,

extnValue OCTET STRING }

本文证书包含的扩展字段如下图,具体不再一一说明。
在这里插入图片描述

第二个元素signatureAlgorithm值也是‘’1.2.156.10197.1.501”,说明同样是SM2签名。

第三个元素signatureValue是BIT STRING类型。值为对tbsCertificate的SM2签名,而按照国密标准本身SM2签名也是ASN1结构,所以从下图可以看出签名的r-s结构。
在这里插入图片描述

证书的X509结构就介绍完毕,欢迎各位指正。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_45303938

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值