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

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

asm ClassVisitor access 解析 asn1解析库_数据

点击证书信息,得到cer扩展名的证书

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

asm ClassVisitor access 解析 asn1解析库_数字证书_02


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

asm ClassVisitor access 解析 asn1解析库_签名算法_03


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

asm ClassVisitor access 解析 asn1解析库_数字证书_04

根据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,展开

asm ClassVisitor access 解析 asn1解析库_数字证书_05


我们在看看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进制显示

asm ClassVisitor access 解析 asn1解析库_签名算法_06

asn1view右下角已经帮我们解释了
02表示INTEGER类型
01表示长度
02是值表示V3版本

以此类推

asm ClassVisitor access 解析 asn1解析库_数字证书_07

算法标识参考GM_T 0006-2012密码应用标识规范.pdf
证书格式参考 GBT 20518-2018信息安全技术_公钥基础设施_数字证书格式.pdf