当前位置:文档之家 > ASN.1讲解数字证书

ASN.1讲解数字证书

通过ASN.1解析来认识数字证书

1、准备工作

首先准备ASN.1的查看工具,本例采用的是Asn1View.exe,需要自行下载。该工具可以查看base64编码后的文件,比如我们常用的x.509数字证书,p7b证书链,p12证书,pfx 个人交换证书,p10证书请求文件,当然,这个工具也可以查看通讯上的asn1编码的数据,比如ldap协议通信中的asn1数据,snmp中的asn1编码的数据等。

然后获取一张证书,获取证书的途径很多,这里不再叙述,给个最简单的方法,访问https://http://www.doczj.com/doc/74c342acf524ccbff12184e0.html,获取站点证书,由于我们只分析证书,不分析私钥信息。所以站点证书完全可以。下图是通过google chrome,查看证书的例子。

ASN.1讲解数字证书

点击证书信息,得到证书

ASN.1讲解数字证书

选择tab栏中的“详细信息”后,选择“复制到文件”。然后一直选择下一步,选择生成文件(最好选择.cer扩展名结尾),到完成

ASN.1讲解数字证书

ASN.1讲解数字证书

ASN.1讲解数字证书

ASN.1讲解数字证书

通过以上步骤,完成证书的获取。OK,工具和证书文件都有了,我们接下来通过ASN1来看看证书的详细信息。

2、证书ASN.1解析

通过工具asn1view工具打开我们刚才导出的支付宝证书文件

ASN.1讲解数字证书

那我们开始一步一步地看看都是些什么东东吧:

在看之前,我们先把ASN1常用的类型标识符列出来。下面解释的时候会用到

ASN.1讲解数字证书

先看第一个SEQUENCE,展开是两个SEQUENCE和一个BITSTRING

ASN.1讲解数字证书

根据RFC3280对证书的解释如下:

ASN.1讲解数字证书

证书信息本身是一个SEQUENCE,里面由两个SEQUENCE和一个BIT STRING组成

第一个SEQUENCE是待签的证书,tbsCertificate=TO BE Signed Certificate

第二个SEQUENCE是签名算法,就是CA准备采用什么签名算法对tbsCertificate进行签名第三个BIT STRING是签名信息,就是CA对tbsCertificate通过signatureAlgorithm签名算法签出来的签名信息。

接下来我们在看看tbsCertificate,展开

ASN.1讲解数字证书

我们在看看RFC3280对TBSCertificate 的定义

ASN.1讲解数字证书

1)Version

第一个Context[0]里面就是证书版本信息了,默认是V1

先看看一下Version的定义

ASN.1讲解数字证书

再看一下ASN1View右面的16进制显示

ASN.1讲解数字证书

asn1view右下角已经帮我们解释了

ASN.1讲解数字证书

绿色的02表示INTEGER类型

蓝色的01表示长度

黄色的02是值表示V3版本

2)serialNumber

ASN.1讲解数字证书

ASN.1讲解数字证书

右侧的16进制

02 10 70 81 52 bb 70 0e 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 b3 02 d0表示值

同样在右下角也有解释。

ASN.1讲解数字证书

3)sign AlgorithmIdentifier

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

ASN.1讲解数字证书

ASN.1讲解数字证书

parameters ANY DEFINED BY algorithm OPTIONAL,该参数被一些算法定义,是一个可选项,我们本次用到的支付宝的这张VeriSign站点证书就是NULL

ASN.1讲解数字证书

ASN1View右下角解释了该张证书的算法标识,是SHA1WithRSA的算法

ASN.1讲解数字证书

大家会发现一个问题,就是算法长度是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 + 第二级,即为1*40 + 2 = 42,十六进制为2A.

第三级是840

840=6*128+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

ASN.1讲解数字证书

ASN.1讲解数字证书

这部分内容比较多,需要多关注一下:

ASN.1讲解数字证书

ASN.1讲解数字证书

Issuer域定义了签名和发布该证书的实体,也就是签发该证书的证书(用户证书签发证书)实体信息,该域必须包含一个非空DN,issu er 域按照X.501的类型名来规定,Name被定义成ASN.1如下结构:

The issuer field identifies the entity who has signed and issued the certificate. The issuer field MUST contain a non-empty distinguished name (DN). The issuer field is defined as the X.501 type Name

[X.501]. Name is defined by the following ASN.1 structures:

Name描述如国家名一类的属性和相应值的体系名称。Attribute决定构成体AttributeValue

的类型:通常情况下,它将是一个DirectoryString。

按对PrintableString、TeletexString、BMPString、UTF8String和UniversalString的选择来规定DirectoryString类型。UTF8String编码是优选编码,并且2003年12月31日之后签发的所有证书必须使用DirectoryString(除下面所说明的之外)UTF8String编码。到那时为止,在生成区分名(包括它们自身的名称)时,合格的CA必须从下面的选项中选择:

(a)若字符集是足够的,可以用PrintableString表示串;

(b)舍弃(a),若BMPString字符集是足够的可以用BMPString表示串;

(c)舍弃(a)和(b).必须用UTF8String表示串。若满足(a)或(b),CA仍然可以选择使用

UTF8String表示串。

UTF8编码还要求如下:

(a) CA可以签发“name rollover”证书来支持依次地转换到UTF8String编码。这类证书将包括以CA的UTF8String编码名作为签发者.同时旧的编码作为持有者或反之。

(b)如上面所述,持有者字段必须使用一对应于持有者CA签发的所有证书的签发者字段内容非空的区分名来填充,而不考虑使用何种编码。

为向后兼容,包括TeletexString和OniversalString.但不应用于证书的新持有者。然而,

在先前已经建立的名字处可以使用这些类型。证书的使用者应准备接收具有这些类型的证书。

除此之外,许多传统的实施支持使用IS0 8859-l字符集编码(拉丁串)的名称,但使用TeletexString.来标识。拉丁串包括不是TeletexString字符集的在西欧使用的字符。处理TeletexString的实施应能处理整个IS0 8859-1字符集。

如上所述,区分名由属性组成。合格的实施必须准备接收包含下面规定的属性类型集的签发者名的证书。

ITU-T X.520中规定属性的标准集。使用本标准的实施必须准备接收签发者名称中的下列

标准属性类型:国家、组织、组织单元、区分名限定词、省名和通用名。除此之外,使用本标准的实施还应准备接收签发者在名称中的下列标准属性类型:地点、称呼、姓、名、名字缩写和生成限定词。

此外,本标准的实施必须准备接收域构成体属性,如RFC2247中规定的。

域(名服务器)系统( DNS)提供体系源标记系统。该属性为希望使用并列于DNS名的DN

的组织提供方便机制。

证书使用者必须准备处理签发者区分名和持有者区分名字段以将证书路径确认名链接,将一个证书中的签发者区分名匹配到CA证书。

本部分仅需要X.500系列规范中规定的名称比较的一个子集。对合格的实施的要求如下:

(a)不同类型编码(例如PrintableString和BMPString)的属性值可以假定表示不同的串;

(b)不以PrintableString类型表示的属性值是大小写敏感的(允许属性值作为二进制客体匹配);

(c)以PrintableString表示的属性值不是大小写敏感的(例如,“Marianne Swanson”与“MARIANNE SWANSON”是一致的);

(d)在移去头和尾部白色空白并且将一个或多个内部连续空白字符子串转换到一个单一空

白之后,以PrintableString表示的属性值是可比较的。

这些名称比较规则允许一个证书用户验证使用证书用户不熟悉的编码语言签发的证书。.

除此之外,根据本部分,还可以使用这些比较规则来处理对名称链接不熟悉的属性类型,允许实施处理使用签发者名称中不熟悉属性的证书。

注意:X.500系列规范中规定的比较规则指示用于编码区分名中的数据的字符集是不相关的。不考虑相关的编码,字符本身是比较的

5)有效期( validity)

ASN.1讲解数字证书

证书有效期是CA保证它将保留有关该证书状态信息的时间间隔。它用两个日期的SEQUENCE来表示。第一个日期是该证书有效期的开始时间(notBefore).第二个则是其结束时间(notAfter)。这两个时间(notBefore和notAfter)可以用UTCTime或GeneralizedTime 来编码。

2049年以前的有效期用UTCTime格式编码.2050及之后的时间必须使用GeneralizedTime 类型。这两种的主要区别在于前者用两个数字来表示年.而后者用4个数字。

a) UCTime

世界时间类型,UTCTime是用于国际上应用的标准的ASN.1类型,此时仅有本地时间是不够的。UTCTIme通过两个低位数字表示年,其时间精度精确到1min或ls。UTCTime包括Z(用于Zulu或Greenwith Mean Time)或一个时间差。

此处,YY≥50,年应解释为19YY:若YY<50.年应解释为20YY。

b) GeneralizedTime

通用的时间类型,GeneralizedTime用于标准ASN.1类型可变精度的时间表示。选用的GeneraiizedTime字段可能包括本地和Greenwith Mean Time之间的时间差异的表示。