数字证书编码ASN.1

发布时间 2023-04-26 18:27:56作者: 20201324徐源

要求

  1. 参考附件中图书p223 中13.2的实验指导,完成DER编码
  2. 序列号=1174(0x0496),证书签发者 DN="CN=Virtual CA,C=CN",证书持有者DN="CN=你的名字拼音, OU=Person,C=CN",证书有效期> =20200222000000-20220222000000。
  3. 用echo -n -e "编码" > 你的学号.der中,用OpenSSL asn1parse 分析编码的正确性
  4. 提交编码过程文档(推荐markdown格式)

查看姓名、学号的16进制ASCII码

echo -n "xuyuan" | od -tc -tx1
echo -n "20201324" | od -tc -tx1

国家学号姓名

AttributeType编码

AttributeType为OBJECT IDENTIFIER基本类型,编码规则采用基本类型定长模式。

对于标识串,采用低标识编码方式,只需1个字节。OBJECT IDENTIFIER的tag 为Ox06;class选择universal,则位8和位7为0,OBJECT IDENTIFIER为基本类型,则位6为0。因此,标识串=Ox06(0000 1010)

对于长度串,采用短型编码方式,只需1个字节

此时,countryName为‘’CN‘’,organizationName为学号,即“20201324”,commonName为姓名,即“xuyuan”

对于内容串,由3个字节组成。

2.5.4.6编码为55 04 06,

2.5.4.10编码为55 04 0A,

2.5.4.3编码为55 04 03

Attribute ValueAssertion编码

对于标识串,采用低标识编码方式,只需1个字节。SEQUENCE的 tag 为0x10;class选择universal,则位8和位7为0,SEQUENCE为结构类型,则位6为1。因此,标识串=0x30。

tag   0X10 = 0001 0000
标识串        0011 0000 = 0x30

对于长度串,采用短型编码方式,只需1个字节。

对于内容串,由AttributeType和 AttributeValue的 DER编码值组成。(注意不是内容串拼接,是der值拼接)

RelativeDistinguishedName

对于标识串,采用低标识编码方式,只需1个字节。SET OF的 tag 为0x11; class 选择universal,则位8和位7为0,SET OF为结构类型,则位6为1。因此,标识串=0x31。

tag:                 0x11 = 0001 0001
SEQUENCE OF为结构类型:        0011 0001  = 0x31

对于长度串,采用短型编码方式,只需1个字节。

对于内容串,由Attribute ValucAssertion的DER编码值组成

RDNSequence编码

对于标识串,采用低标识编码方式,只需1个字节。SEQUENCE OF的 tag 为0x10;class选择universal,则位8和位7为0,SEQUENCE OF为结构类型,则位6为1。因此,标识串=0x30。

tag:                 0x10 = 0001 0000
SEQUENCE OF为结构类型:        0011 0001  = 0x30

对于长度串,采用短型编码方式,只需1个字节。

对于内容串,由3个 RelativeDistinguishedName的 DER编码值组成。

Name编码

Name为CHOICE类型,其DER编码值与RDNSequence相同。

综上可得最终DER编码值

30 31
31 0B
      30 09
            06 03 55 04 06 
            	13 02
                    43 4E 
31 11
      30 0F 
            06 03 55 04 0A
                13 08 
                     32 30 32 30 31 33 32 34 
31 0F
      30 0D
            06 03 55 04 03
           		 13 06
                     78 75 79 75 61 6e
echo -n -e "\x30\x31\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x43\x4E\x31\x11\x30\x0F\x06\x03\x55\x04\x0A\x13\x08\x32\x30\x32\x30\x31\x33\x32\x34\x31\x0F\x30\x0D\x06\x03\x55\x04\x03\x13\x06\x78\x75\x79\x75\x61\x6E" >> 20201324.der

UTC Time编码(对有效期编码)

由表知标记符为0x17

20200222000000 转 16进制 32 30 32 30 30 32 32 32 30 30 30 30 30 30

20220222000000 转 16进制 32 30 32 32 30 32 32 32 30 30 30 30 30 30

Integer编码(对序列号编码)

标记符为0x02

验证

//序列号1174(0x0496)
echo -n -e "\x02\x02\x04\x96" > 20201324.der

//证书签发者DN="CN=Virtual CA
echo -n -e "\x30\x22\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x43\x4E\x31\x13\x30\x11\x06\x03\x55\x04\x03\x13\x0A\x56\x69\x72\x74\x75\x61\x6C\x20\x43\x41" >> 20201324.der

//证书有效期=20200222000000-20220222000000
echo -n -e "\x17\x0D\x32\x30\x32\x30\x30\x32\x32\x32\x30\x30\x30\x30\x5A\x17\x0D\x32\x30\x32\x32\x30\x32\x32\x32\x30\x30\x30\x30\x5A" >> 20201324.der

//证书持有者DN="CN=你的名字拼音, OU=Person,C=CN
echo -n -e "\x30\x31\x31\x0B\x30\x09\x06\x03\x55\x04\x06\x13\x02\x43\x4E\x31\x11\x30\x0F\x06\x03\x55\x04\x0A\x13\x08\x32\x30\x32\x30\x31\x33\x32\x34\x31\x0F\x30\x0D\x06\x03\x55\x04\x03\x13\x06\x78\x75\x79\x75\x61\x6E" >> 20201324.der

openssl asn1parse -inform der -in ./20201324.der

验证正确