基于BouncyCastle的ASN.1分析工具设计与实现
一、分析过程
-
下载ASN.1的查看工具Asn1View
-
访问支付宝,获取站点证书
-
导出证书
详细信息
-复制到文件
-DER编码二进制X.509(.CER)
,在Asn1View.exe
中打开
标识符 分隔符 Integer 0x02 Bit String 0x03 OCTET String 0x04 Null 0x05 Object Indentifier 0x06 UTF8 String 0x12 Printable String 0x13 UTC Time 0x17 Sequence 0x30 Set 0x31 -
RFC3280对证书的解释如下
Certificate ::= SEQUENCE { tbsCertificate TBSCertificate, # 证书 signatureAlgorithm AlgorithmIdentifier, # 签名算法 signature BIT STRING # 签名 }
-
证书信息本身是一个 SEQUENCE,里面由两个 SEQUENCE和一个BIT STRING组成
SEQUENCE
待签的证书,tbsCertificate=TO BE Signed Certificate
;SEQUENCE
签名算法,就是CA准备采用什么签名算法对tbsCertificate
进行签名;BIT STRING
签名信息,CA对tbsCertificate
通过signatureAlgorithm
签名算法签出来的签名信息。
-
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, # 颁发者唯一ID -- If present, version shall be v2 or v3 subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL, # 主题唯一ID -- If present, version shall be v2 or v3 extensions [3] EXPLICIT Extensions OPTIONAL # 扩展 -- If present, version shall be v3 }
-
Version
Context[0]
(第一个)里面就是证书版本信息(默认V1
)Version
的定义Version ::= INTEGER { v1(0),v2(1),v3(2)
Asn1View
的16进制显示
-
serialNumber
serialNumber
的定义CertificateSerialNumber ::= INTEGER
Asn1View
的16进制显示
-
sign AlgorithmIdentifier
sign AlgorithmIdentifier
的定义AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT IDENTIFIER, # 加密算法 parameters ANY DEFINED BY algorithm OPTIONAL # 由算法定义,Alipay VeriSign站点证书是NULL }
Asn1View
解释算法标识
-
issuer
-
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)) }
-
Asn1View
解释算法标识
-
根据对
PrintableString
/TeletexString
/BMPString
/UTF8String
/UniversalString
的选择来规定DirectoryString
类型,2003年12月31日
之后签发的所有证书的DirectoryString
必须使用UTF8String
编码,生成区分名(包括自身名称)时,合格的CA必须从下面的选项中选择:- 若字符集足够则可以用
PrintableString
表示串; - 若不满足则
BMPString
字符集是足够的可以用BMPString
表示串; - 若都不满足则必须用
UTF8String
表示串,若都满足则CA仍然可以选择使用UTF8String
表示串。
- 若字符集足够则可以用
-
UTF8
编码要求:- CA可以签发
name rollover
证书来支持依次地转换到UTF8String
编码。这类证书将包括以CA的UTF8String
编码名作为签发者,同时旧的编码作为持有者或反之; - 如上所述,持有者字段必须使用一对应于持有者CA签发的所有证书的签发者字段内容非空的区分名来填充,而不考虑使用何种编码。
- CA可以签发
-
考虑到兼容性,包括
TeletexString
和OniversalString
但不应用于证书的新持有者。然而在先前已经建立的名字处可以使用这些类型,证书的使用者应准备接收具有这些类型的证书。 -
除此之外许多传统的实施支持使用IS0 8859-1字符集编码(拉丁串)的名称,但使用
TeletexString
来标识。拉丁串包括不是TeletexString
字符集的在西欧使用的字符,处理TeletexString
的实施应能处理整个IS0 8859-1字符集。 -
如上所述, 区分名由属性组成。合格的实施必须准备接收包含下面规定的属性类型集的签发者名的证书。
-
ITU-T X.520中规定属性的标准集。使用本标准的实施必须准备接收签发者名称中的下列标准属性类型:国家、组织、组织单元、区分名限定词、省名和通用名。除此之外, 使用本标准的实施还应准备接收签发者在名称中的下列标准属性类型:地点、称呼、姓、名、名字缩写和生成限定词。
-
此外,本标准的实施必须准备接收域构成体属性,如RFC2247中规定的。域(名服务器)系统(DNS)提供体系源标记系统。该属性为希望使用并列于DNS名的DN的组织提供方便机制。
-
证书使用者必须准备处理签发者区分名和持有者区分名字段以将证书路径确认名链接, 将一个证书中的签发者区分名匹配到 CA证书。本部分仅需要
X.500
系列规范中规定的名称比较的一个子集,对合格实施的要求如下:- 不同类型编码(如
PrintableString
和BMPString
)的属性值可以假定表示不同的串; - 不以
PrintableString
类型表示的属性值是大小写敏感的(允许属性值作为二进制客体匹配); - 以
PrintableString
表示的属性值非大小写敏感(如Marianne Swanson
与MARIANNE SWANSON
一致); - 移去头尾部空白并将一个或多个内部连续空白字符子串转换到一个单一空白之后,以
PrintableString
表示的属性值是可比较的。
- 不同类型编码(如
-
这些名称比较规则允许一个证书用户验证使用证书用户不熟悉的编码语言签发的证书。 .
-
除此之外根据本部分,还可以使用这些比较规则来处理对名称链接不熟悉的属性类型,允许实施处理使用签发者名称中不熟悉属性的证书。
-
-
Validity
-
Asn1View
解释算法标识
-
证书有效期是CA保证它将保留有关该证书状态信息的时间间隔。它用两个日期的
SEQUENCE
来表示,第一个日期是该证书有效期的开始时间notBefore
,第二个则是其结束时间notAfter
,notBefore
和notAfter
这两个时间可以用 UTCTime或 GeneralizedTime来编码。 -
2049年
以前的有效期用UTCTime
格式编码2050年
及之后的时间必须使用GeneralizedTime
类型,主要区别在于前者用两个数字来表示年,而后者用4个数字。-
UCTime
世界时间类型,UTCTime
是用于国际上应用的标准的ASN.1
类型,此时仅有本地时间是不够的。UTCTIme
通过两个低位数字表示年, 其时间精度精确到1min
或ls
,UTCTime
包括Z(用于Zulu
或Greenwith Mean Time
)或一个时间差,若YY≥ 50年
是19YY
,若YY<50年
则是20YY
; -
GeneralizedTime
通用的时间类型,GeneralizedTime
用于标准ASN.1
类型可变精度的时间表示。选用的GeneraiizedTime
字段可能包括本地和Greenwith Mean Time
之间的时间差异的表示。
-
-
二、遇到的问题
- 比较多个算法长度都与实际显示不符,例如
SHA1WithRSA
的1.2.840.113549.1.1.5
明显超过了9个长度
- 原因是OID具有自己的编码规则,其编码过程如下:
- 一级*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=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
- 一级*40+二级,即为