来源于:PKI & 密码学 公众号 https://mp.weixin.qq.com/s/zAR6zkHUftdl08tSiVPZTw 2014-09-29

PKI知识普及-通过ASN.1解析来认识证书 - 图1

1、准备工作

首先准备ASN.1的查看工具,本例采用的是Asn1View.exe,需要自行下载。该工具可以查看base64编码后的文件,比如我们常用的x.509数字证书,p7b证书链,p12证书,pfx个人交换证书,p10证书请求文件,当然,这个工具也可以查看通讯上的asn1编码的数据,比如ldap协议通信中的asn1数据,snmp中的asn1编码的数据等。
然后获取一张证书,获取证书的途径很多,这里不再叙述,给个最简单的方法,访问https://www.alipay.com,获取站点证书,由于我们只分析证书,不分析私钥信息。所以站点证书完全可以。下图是通过google chrome,查看证书的例子。
PKI知识普及-通过ASN.1解析来认识证书 - 图2
点击证书信息,得到证书
PKI知识普及-通过ASN.1解析来认识证书 - 图3
选择tab栏中的“详细信息”后,选择“复制到文件”。然后一直选择下一步,选择生成文件(最好选择.cer扩展名结尾),到完成
PKI知识普及-通过ASN.1解析来认识证书 - 图4PKI知识普及-通过ASN.1解析来认识证书 - 图5
PKI知识普及-通过ASN.1解析来认识证书 - 图6PKI知识普及-通过ASN.1解析来认识证书 - 图7
通过以上步骤,完成证书的获取。OK,工具和证书文件都有了,我们接下来通过ASN1来看看证书的详细信息。

2、证书ASN.1解析

通过工具asn1view工具打开我们刚才导出的支付宝证书文件
PKI知识普及-通过ASN.1解析来认识证书 - 图8
那我们开始一步一步地看看都是些什么东东吧:
在看之前,我们先把ASN1常用的类型标识符列出来。下面解释的时候会用到
PKI知识普及-通过ASN.1解析来认识证书 - 图9
先看第一个SEQUENCE,展开是两个SEQUENCE和一个BITSTRING
PKI知识普及-通过ASN.1解析来认识证书 - 图10
根据RFC3280对证书的解释如下:

Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate, 1证书
signatureAlgorithm AlgorithmIdentifier, 2签名算法
signature BIT STRING 3签名
}

证书信息本身是一个SEQUENCE,里面由两个SEQUENCE和一个BIT STRING组成
第一个SEQUENCE是待签的证书,tbsCertificate=TO BE Signed Certificate
第二个SEQUENCE是签名算法,就是CA准备采用什么签名算法对tbsCertificate进行签名
第三个 BIT STRING是签名信息,就是CA对tbsCertificate通过signatureAlgorithm签名算法签出来的签名信息。
接下来我们在看看tbsCertificate,展开
PKI知识普及-通过ASN.1解析来认识证书 - 图11
我们在看看RFC3280对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,
— If present, version shall be v2 or v3
subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,
— If present, version shall be v2 or v3
extensions [3] EXPLICIT Extensions OPTIONAL
— If present, version shall be v3
}


大家会发现一个问题,就是算法长度是09,而算法OID问什么会是1.2.840.113549.1.1.5,明显超过了9个长度,而且86 48 86 f7 0d 01 01 05也和这个OID没有任何关系。这是因为OID是有一套自己的标码规则的,配合着下面的例子大概说一下,就明白了
以上面的OID为例:1.2.840.113549.1.1.5
编码过程:
ISO规定前两级格式为:第一级 40 + 第二级,即为 140 + 2 = 42,十六进制为 2A.
第三级是840
840=6128+72
{将6,72}以big-endian高位加1,也就是加128
将6+128=134转换成16进制就是86
72转换成16进制就是48
所以第四位的16进制表示就是86 48
第四级113549
113549=6
128^2+119*128+13
{6,119,13}以big-endian高位加1,也就是加128变成{134,247,13}
对应的16进制分别是86,F7,07
后面的小于128的直接转换
1.1.5
01 01 05
最后得到的16进制就是 2A 86 48 D8 5F 01 01 05

1) issuer

| 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

DirectoryString ::= CHOICE {
teletexString TeletexString (SIZE (1..MAX)),
printableString PrintableString (SIZE (1..MAX)),
universalString UniversalString (SIZE (1..MAX)),
utf8String UTF8String (SIZE (1..MAX)),
bmpString BMPString (SIZE (1..MAX)) } | | —- |

Issuer域定义了签名和发布该证书的实体,也就是签发该证书的证书实体信息

第一个Context[0]里面就是证书版本信息了,默认是V1
先看看一下Version的定义

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


再看一下ASN1View右面的16进制显示
PKI知识普及-通过ASN.1解析来认识证书 - 图12
asn1view右下角已经帮我们解释了
PKI知识普及-通过ASN.1解析来认识证书 - 图13
绿色的02表示INTEGER类型
蓝色的01表示长度
黄色的02是值表示V3版本

2)SerialNumber

表示证书的唯一标识序列号,它的RFC3280定义如下

CertificateSerialNumber ::= INTEGER

PKI知识普及-通过ASN.1解析来认识证书 - 图14
右侧的16进制
02 10 70 81 52 bb 700e 62 e9 ed 22 27 e6 d6 b3 02 d0
表示分别是02表示INTEGER类型,10是16进制表示的长度10进制就是16,70 81 52 bb 70 0e 62 e9 ed 22 27 e6 d6 b302 d0表示值
同样在右下角也有解释。
PKI知识普及-通过ASN.1解析来认识证书 - 图15

3)sign AlgorithmIdentifier


表示签名算法标,它的RFC3280定义如下

AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}

algorithmOBJECT IDENTIFIER,被用来表示一个加密算法
parametersANY DEFINED BY algorithm OPTIONAL,该参数被一些算法定义,是一个可选项,我们本次用到的支付宝的这张VeriSign站点证书就是NULL
PKI知识普及-通过ASN.1解析来认识证书 - 图16

ASN1View右下角解释了该张证书的算法标识,是SHA1WithRSA的算法
PKI知识普及-通过ASN.1解析来认识证书 - 图17

大家会发现一个问题,就是算法长度是09,而算法OID问什么会是1.2.840.113549.1.1.5,明显超过了9个长度,而且86 48 86 f7 0d 01 01 05也和这个OID没有任何关系。这是因为OID是有一套自己的标码规则的,配合着下面的例子大概说一下,就明白了
以上面的OID为例:1.2.840.113549.1.1.5
编码过程:
ISO规定前两级格式为:第一级 40 + 第二级,即为 140 + 2 = 42,十六进制为 2A.
第三级是840
840=6128+72
{将6,72}以big-endian高位加1,也就是加128
将6+128=134转换成16进制就是86
72转换成16进制就是48
所以第四位的16进制表示就是86 48
第四级113549
113549=6
128^2+119*128+13
{6,119,13}以big-endian高位加1,也就是加128变成{134,247,13}
对应的16进制分别是86,F7,07
后面的小于128的直接转换
1.1.5
01 01 05
最后得到的16进制就是 2A 86 48 D8 5F 01 01 05

4)ISSUER—》与1)重复,需要再确认下

这部分内容比较多,需要多关注一下:
首先先看一下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

DirectoryString ::= CHOICE {
teletexString TeletexString (SIZE (1..MAX)),
printableString PrintableString (SIZE (1..MAX)),
universalString UniversalString (SIZE (1..MAX)),
utf8String UTF8String (SIZE (1..MAX)),
bmpString BMPString (SIZE (1..MAX)) } | | —- |

Issuer域定义了签名和发布该证书的实体,也就是签发该证书的证书实体信息