ASN.1分析Alipay证书

基于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签名算法签出来的签名信息。
  • RFC3280TBSCertificate的定义如下

    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签发的所有证书的签发者字段内容非空的区分名来填充,而不考虑使用何种编码。
    • 考虑到兼容性,包括TeletexStringOniversalString但不应用于证书的新持有者。然而在先前已经建立的名字处可以使用这些类型,证书的使用者应准备接收具有这些类型的证书。

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

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

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

    • 此外,本标准的实施必须准备接收域构成体属性,如RFC2247中规定的。域(名服务器)系统(DNS)提供体系源标记系统。该属性为希望使用并列于DNS名的DN的组织提供方便机制。

    • 证书使用者必须准备处理签发者区分名和持有者区分名字段以将证书路径确认名链接, 将一个证书中的签发者区分名匹配到 CA证书。本部分仅需要X.500系列规范中规定的名称比较的一个子集,对合格实施的要求如下:

      • 不同类型编码(如PrintableStringBMPString)的属性值可以假定表示不同的串;
      • 不以PrintableString类型表示的属性值是大小写敏感的(允许属性值作为二进制客体匹配);
      • PrintableString表示的属性值非大小写敏感(如Marianne SwansonMARIANNE SWANSON一致);
      • 移去头尾部空白并将一个或多个内部连续空白字符子串转换到一个单一空白之后,以PrintableString表示的属性值是可比较的。
    • 这些名称比较规则允许一个证书用户验证使用证书用户不熟悉的编码语言签发的证书。 .

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

  • Validity

    • Asn1View解释算法标识

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

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

      • UCTime世界时间类型,UTCTime是用于国际上应用的标准的ASN.1类型,此时仅有本地时间是不够的。UTCTIme通过两个低位数字表示年, 其时间精度精确到1minlsUTCTime包括Z(用于ZuluGreenwith Mean Time)或一个时间差,若YY≥ 50年19YY,若YY<50年则是20YY

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

二、遇到的问题

  • 比较多个算法长度都与实际显示不符,例如SHA1WithRSA1.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

三、参考资料

posted @ 2020-04-12 21:41  xuem99  阅读(519)  评论(0)    收藏  举报