ANS.1结合CSR文件学习笔记

 

1.填充内容说明

CA证书申请CSR文件主要包括Common Name,Organization,Organizational Unit,City/Locality,State/County/Region,Country,Email address,Public Key,signature以上都是可变的填充内容,即不同申请用户,填写的内容不一样。参考链接:

https://www.sslshopper.com/what-is-a-csr-certificate-signing-request.html

此外还有一些rsaEncryption,sha1WithRSAEncryption算法标识可以固定。

 

CSR文件的数据如下所示:

-----BEGIN CERTIFICATE REQUEST-----

MIICojCCAYoCAQAwLTENMAsGA1UEAxMEdmtleTENMAsGA1UECxMEdGVzdDENMAsGA1UEChMEdGVzdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK2HvmKZKcCLImxpwHprwl82S6y26MXGN+3WsRAfEmbKdjSRm9qQIR4V+AwO2DIRhc8PI47ZMJV0gwd7FQCnb9y6oRJwiKq5IWOdoZa+ZMTe0dn1bCH/0ib+BB6/IZdPrjGyhLB0hUgzryQQG7gIjz6ch1giNy2/6h5KOaS5CerLKLLsDRrCiXfWyN7GIP6RNuCsZGwiYQwf48ym56/UWyVS/TIMWdyZB7zQ0Eh1wCzLOkP7TE+DVmoLbT/f0cpqxQuDxZoyffdg5kEom0PubhCuII11mALIXx7wX8dE6RWB/syG2ZAEhLN3SFyZP8OGVOazfoFww1nepDmuDN8L2McCAwEAAaAwMC4GCSqGSIb3DQEJDjEhMB8wHQYDVR0OBBYEFLoMAZ+K8JaAVdIfAon6SZpD4MHHMA0GCSqGSIb3DQEBCwUAA4IBAQBCJGU8A75v1u1ylT4YxLNOGvsKfzGxg5SsSO+Ikdc3c1G99afRhl84sDAqAzXLdwMLTCX7G0tRGYK8fCVkED9AKNX+1enJNB8P3R0mWWuFkLmtOPEKhNrgaa+qYno0/KiRgjfLo1etwv/63LrQtMvUz28qNkX6ivkKvTsccX44kFv5CxmFJ95yVkEoAlKC5g6WDwx4tyWZykHQhdWGVtWE/3CB/Ba8wtcqJmHzW/NGvQD3JQKMv+HDZRk5bvgSor56+XH6p9UDqnRmz4sS/+x8b/vKYRkLPpSjLPgo5w4dfYoTIbZ9w83RcFUrNSxRY05CE8xCdyRd2cCgbnv1+X4K

-----END CERTIFICATE REQUEST-----

利用网站可以解析CSR文件得到ASN.1编码文件。网址链接如下:

https://certlogik.com/decoder/

解析结果为:

Subject

RDN

Value

Common Name (CN)

testcert.redkestrel.co.uk

Organization (O)

Red Kestrel Consulting Ltd

Locality (L)

Stoke on Trent

State (ST)

Staffordshire

Country (C)

GB

Properties

Property

Value

Subject

CN = testcert.redkestrel.co.uk,O = Red Kestrel Consulting Ltd,L = Stoke on Trent,ST = Staffordshire,C = GB

Key Size

2048 bits

Fingerprint (SHA-1)

2E:7E:41:27:0F:E0:D9:A8:E4:5E:68:DC:89:64:5F:A5:D0:FB:47:BF

Fingerprint (MD5)

59:1D:E9:57:7B:AE:BA:18:FE:E6:A6:CC:14:AC:C4:2C

SANS

 

CSR Detailed Information

    Certificate Request:

    Data:

        Version: 0 (0x0)

        Subject:

            commonName                = testcert.redkestrel.co.uk

            organizationName          = Red Kestrel Consulting Ltd

            localityName              = Stoke on Trent

            stateOrProvinceName       = Staffordshire

            countryName               = GB

        Subject Public Key Info:

            Public Key Algorithm: rsaEncryption

                Public-Key: (2048 bit)

                Modulus:

                    00:d6:2d:e5:bc:f0:87:80:21:ad:e7:db:74:7d:f6:

                    2f:3b:e1:f8:74:8d:eb:5f:f9:24:ec:18:f8:24:7c:

                    65:c6:27:ef:ad:72:52:86:93:73:09:13:48:a3:0f:

                    83:cd:6b:11:97:50:23:54:2e:09:f6:44:ec:b2:6e:

                    6e:6c:4e:61:b3:a4:43:83:fb:50:00:03:25:7e:a4:

                    b4:28:14:d9:07:10:5b:ae:74:6a:95:33:a5:e4:3d:

                    67:ea:68:cd:af:2a:f7:73:51:b3:cf:0b:45:ff:31:

                    f0:c5:18:fc:5c:f0:06:37:4d:43:37:f3:97:3d:73:

                    df:d6:38:81:7a:35:47:00:bc:01:48:40:5d:33:1b:

                    b7:af:cc:96:41:a8:36:f8:7a:75:27:6a:d3:12:2c:

                    79:b1:45:63:22:d4:97:87:b5:f2:c8:35:78:4d:8a:

                    d1:de:c0:44:16:80:80:77:8f:5c:66:87:b0:8f:3b:

                    91:5e:4d:be:87:cd:00:f1:73:e7:fb:b8:c8:ac:63:

                    ab:3d:27:f3:e1:dc:67:8e:09:e2:03:a2:8a:94:f2:

                    39:df:57:97:86:13:32:0c:1f:90:85:31:98:da:8e:

                    b3:4a:17:80:d8:2b:76:11:c9:42:34:2b:ae:be:bf:

                    42:88:2e:85:27:b4:4b:3e:f8:cd:b4:2e:13:a7:f9:

                    51:3d

                Exponent: 65537 (0x10001)

        Attributes:

            a0:00

    Signature Algorithm: sha1WithRSAEncryption

         51:61:3b:a0:15:f7:48:b8:d8:34:ce:77:6e:c0:4e:94:d1:a7:

         b2:00:29:d4:fd:5f:88:23:e9:10:a6:99:18:43:94:27:6c:4e:

         82:e2:07:4a:ed:4d:d5:98:a0:2a:95:a6:88:00:19:c6:ea:1a:

         81:6d:51:fc:03:4c:de:35:e9:bc:22:d5:05:1b:f8:d0:01:c2:

         16:ca:2d:f6:e7:6b:74:26:23:23:8d:da:0c:70:1a:62:f2:e6:

         4f:8f:cf:be:99:ed:72:7d:3f:ef:e8:3f:fd:e9:40:1e:1a:fd:

         50:8a:28:31:9c:30:c2:8e:b2:a2:6e:bb:27:07:f0:fd:b7:bf:

         83:b3:1a:7b:b9:8f:1d:9d:a5:b1:04:d2:d3:68:44:7a:a5:72:

         9c:84:64:d9:6f:66:79:05:0b:ae:df:bf:6a:da:20:d2:6a:89:

         48:1c:74:5a:cc:2d:1e:58:93:73:e9:d7:16:94:2b:c0:52:04:

         cd:5b:8f:18:23:95:c3:b2:e6:09:f3:66:1c:d0:a4:65:5b:91:

         48:90:7f:f4:c7:4b:9a:b7:f0:72:13:c8:dc:d7:93:19:27:be:

         05:97:ec:3a:da:6d:db:fe:e3:f9:ba:9e:60:a1:6e:f0:1d:2c:

         b4:ba:09:04:49:e2:87:15:28:57:5f:2e:64:e9:8e:7a:e5:6e:

         5f:53:7a:9c

(类型偏移量)(类型包含数据量)  

CSR ASN.1 Information

  0 717: SEQUENCE {

  4 437:   SEQUENCE {

  8   1:     INTEGER 0

 11 135:     SEQUENCE {

 14  11:       SET {

 16   9:         SEQUENCE {

 18   3:           OBJECT IDENTIFIER countryName (2 5 4 6)

 23   2:           PrintableString 'GB'

       :           }

       :         }

 27  22:       SET {

 29  20:         SEQUENCE {

 31   3:           OBJECT IDENTIFIER stateOrProvinceName (2 5 4 8)

 36  13:           PrintableString 'Staffordshire'

       :           }

       :         }

 51  23:       SET {

 53  21:         SEQUENCE {

 55   3:           OBJECT IDENTIFIER localityName (2 5 4 7)

 60  14:           PrintableString 'Stoke on Trent'

       :           }

       :         }

 76  35:       SET {

 78  33:         SEQUENCE {

 80   3:           OBJECT IDENTIFIER organizationName (2 5 4 10)

 85  26:           PrintableString 'Red Kestrel Consulting Ltd'

       :           }

       :         }

113  34:       SET {

115  32:         SEQUENCE {

117   3:           OBJECT IDENTIFIER commonName (2 5 4 3)

122  25:           PrintableString 'testcert.redkestrel.co.uk'

       :           }

       :         }

       :       }

149 290:     SEQUENCE {

153  13:       SEQUENCE {

155   9:         OBJECT IDENTIFIER rsaEncryption (1 2 840 113549 1 1 1)

166   0:         NULL

       :         }

168 271:       BIT STRING

       :         30 82 01 0A 02 82 01 01 00 D6 2D E5 BC F0 87 80

       :         21 AD E7 DB 74 7D F6 2F 3B E1 F8 74 8D EB 5F F9

       :         24 EC 18 F8 24 7C 65 C6 27 EF AD 72 52 86 93 73

       :         09 13 48 A3 0F 83 CD 6B 11 97 50 23 54 2E 09 F6

       :         44 EC B2 6E 6E 6C 4E 61 B3 A4 43 83 FB 50 00 03

       :         25 7E A4 B4 28 14 D9 07 10 5B AE 74 6A 95 33 A5

       :         E4 3D 67 EA 68 CD AF 2A F7 73 51 B3 CF 0B 45 FF

       :         31 F0 C5 18 FC 5C F0 06 37 4D 43 37 F3 97 3D 73

       :                 [ Another 142 bytes skipped ]

       :       }

443   0:     [0]

       :       Error: Object has zero length.

       :     }

445  13:   SEQUENCE {

447   9:     OBJECT IDENTIFIER sha1WithRSAEncryption (1 2 840 113549 1 1 5)

458   0:     NULL

       :     }

460 257:   BIT STRING

       :     51 61 3B A0 15 F7 48 B8 D8 34 CE 77 6E C0 4E 94

       :     D1 A7 B2 00 29 D4 FD 5F 88 23 E9 10 A6 99 18 43

       :     94 27 6C 4E 82 E2 07 4A ED 4D D5 98 A0 2A 95 A6

       :     88 00 19 C6 EA 1A 81 6D 51 FC 03 4C DE 35 E9 BC

       :     22 D5 05 1B F8 D0 01 C2 16 CA 2D F6 E7 6B 74 26

       :     23 23 8D DA 0C 70 1A 62 F2 E6 4F 8F CF BE 99 ED

       :     72 7D 3F EF E8 3F FD E9 40 1E 1A FD 50 8A 28 31

       :     9C 30 C2 8E B2 A2 6E BB 27 07 F0 FD B7 BF 83 B3

       :             [ Another 128 bytes skipped ]

       :   }

2.ANS.1编码的规则介绍

这边先简单介绍下ANS.1编码的规则。ANS.1采取的是类似于TLV的格式,即tag标识+length数据长度+Value内容。

1.数据类型标识:

证书中主要涉及到两种ANS.1数据类型,一个是容器(container)

容器是值一个包含了其他相同或者不同类型元素的数据类型(例如序列值SEQUENCE或集合值SET类型).目的是为了组合一些复杂的数据类型集.ASN.1规范定义了4种容器类型:序列(SEQUENCE标识30),单一序列(SEQUENCE OF),集合(SET标识31)和单一集合(SET OF)。证书文件目前主要用到SEQUENCE和SET类型。

一个是数据类型,主要包括以下数据类型。

代码

ASN.1类型

作用

1(0x01)

布尔型

储存布尔值

2(0x02)

整数

储存大整数

3(0x03)

位串

存储位数组

4(0x04)

八位位串

存储字节数组

5(0x05)

预留位(例如在选择修改器中)

6(0x06)

对象标识符

标识算法及协议

16(0x10)

序列和单一序列

未分类元素的容器

17(0x11)

集合和单一集合

已分类元素的容器

19(0x13)

可打印字符串

ASCII编码(忽略一些不可打印字符)

22(0x16)

IA5String

ASCII编码

23(0x17)

世界协调时

以统一格式表示的时间

2.数据长度

       编码字节的最高位代表的是短编码还是长编码;而低7位则形成一个长度立即数。
(1)短编码。
        在短编码中,负载的长度必须小于128字节。长度立即数用来表示负载的长度。例如,对于一个长度为65 (0x41)的负载进行编码,其长度编码字节只需简单的设置为0x41即可。因为其最高位是0,则编码器可以判断出这是短编码,而且长度是65。
(2) 长编码。
        在长编码中,定义了附加的抽象数据来对长度进行编码,它仅适用于所有长度为128字节或以上的负载。在这种模式下,长度立即数存储的是为了表示负载长度所需的字节数。这个长度必须以big-endian格式进行编码。(其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。)。
         例如,为一个长度为47310 (0xB8CE)的负载进行编码,因为它的长度大于127, 所以要采用长编码方式。实际的长度需要两个字节来表示。则,长度编码字节为0x82; 然后用big-endian格式存储的长度值为0xB8 0xCE。则全部长度编码为 0x82 B8 CE。

3.数据类型介绍

1.整型(INTEGER)

整数类型表示一个有符号的任意精度的标量,它的编码是可移植,平台无关的。正整数的编码比较简单。每个字节表示的最大整数是255 (0xFF), 存储的实际数值分成字节大小的数字,并且以big-endian格式存储。例如:

八位位组{Xk, Xk-1,...., X0}将以递减的顺序从Xk到X0进行存储.编码规定正整数的第一个字节的最高位必须是0,即Xk的最高为必须是0,为1的话则为负数.例如: x = 49468= 193 * 256 + 60 = 0xC1 * 0x FF + 0x3C; 即X1=0xC1, X0 = 0x3C. 按正常规定,编码应该是 0x02 02 C1 3C, 但是X1的最高位是1, 应该被看成负数.最简单的方法是用前端零字节进行填充.编码变为 0x02 02 00 C1 3C。
    负整数的编码有些复杂.要先找到一个最小的256的幂,使它比要编码的负数的绝对值还要大。例如:x = - 1555;被1555大的256的最小的幂是256^2 = 65536;然后将这个数跟负数相加以得到2的补码。65536 + (-1555) = 63981 =  0xF9 * 0xFF + 0x ED,则编码为 0x02 02 F9 ED。

2.对象标识符 (OBJECT Identifier,OID)

对象标识符(OBJECT IDENTIFIER, OID)类型用层次的形式来表示标准规范.标识符树通过一个点分的十进制符号来定义,这个符号以组织,子部分然后是标准的类型和各自的子标识符开始.
      例如:MD5的OID 是 1.2.840.113549.2.5  表示为"iso(1) member-body (2) US (840) rsadsi(113549) digestAlgorithm (2) md5 (5)", 所以当解程序看到这个OID时,就知道是MD5散列.
      OID在公钥算法标准中很流行,它指出证书绑定了哪种散列算法. 同样,也有公钥算法,分组算法,和操作模式的OID. 它们是一种高效且可移植的表示数据包中所选算法的形式.
      对OID的编码规则: 
前两部分如果定义为x.y, 那么它们将合成一个字40*x + y, 其余部分单独作为一个字节进行编码.
每个字首先被分割为最少数量的没有头零数字的7位数字.这些数字以big-endian格式进行组织,并且一个接一个地组合成字节. 除了编的最后一个字节外,其他所有字节的最高位(位8)都为1.
     举例: 30331 = 1 * 128^2 + 108 * 128 + 123  分割成7位数字(0x80)后为{1,108,123}设置最高位后变成{129,236,123}.如果该字只有一个7位数字,那么最高为0.
     MD5 OID的编:

1. 将1.2.840.113549.2.5转换成字数组 {42, 840, 113549, 2, 5}。
2. 然后将每个字分割为带有最高位的7位数字,{{0x2A},{0x86,0x48},{0x86,0xF7,0x0D},{0x02},{0x05}}。
3. 最后完整的编为 0x06 08 2A 86 48 86 F7 0D 02 05。

3. 可打印字符串和IA5String类型

可打印字符串(PrintableString)和IA5String类型定义了一种独立于本地代页和字符集定义,在任何平台上都可以将ASCII字符串编为可读字符串的可移植方法.
    可打印字符串对象是ASCII集合的一个有限子集,这个子集包括32,39,40~41,43~58,61,63以及65~122.
       IA5String类型的编对象是ASCII集合中的大多数.包括NULL,BEL,TAB,NL,LF,CR以及32~126.
       可打印字符串和IA5String的编和八位位组串相似.可打印字符串的头字节是0x13, IA5String的是0x16. 例如:"Hello World"的编为0x13 0B 48 65 6D 6D 6F 20 57 6F 72 6D 64。4. 位串类型

      位串(BIT STRING)类型以可移植形式表示位数组。除了ASN.1头部两个字节之外,还有一个附加的头部用来表示填充数据(通常是一个字节,因为填充是为了形成一个完整的字节)。编码规则:位串的第一位放到第一个负载字节的第8位;位串的第二位放到第一个负载字节的第7位;依此类推。填充满第一个负载字节,就继续填充第二个负载字节。如果最后一个负载字节未被填充满,空的位用0来填充,0的个数存放到头部用来表示填充数据的那个字节里。

下面举例说明:

有一个位串{1,0,0,0,1,1,1,0,1,0,0,1},开始填充负载字节。第一个字节填充后为10001110 = 0x 8E;第二个字节填充后为10010000 = 0x90,低位4个0为填充的空位。则负载为2个字节加上表示填充0个数的一个字节0x04总共3个字节。则完整的编码为:0x03 03 04 8E 90。

5. 空类型

     空(NULL)类型实际上是"占位符", 它是含有空白选项的选择修改器所特有.例如:

          MyAccount ::= SEQUENCE {

                    Name                            IA5String,

                    Group                           IA5String,

                   Credentials                    CHOICE{

                                                              rsaKey           RSAPublicKey,

                                                              passwdHash  OCTET STRING,

                                                              none               NULL

                                                         }

           }

     在上面这个结构中,帐号的证书应该包含一个RSA密钥或一个密码散列值或什么都没有。空类型的编码是 0x05 00。

4.ASN.1编码数据解析例子

上文提到的证书申请文件内容,经过base64解码的16进制数据如下所示,经过ASN.1编码标注。

30 82 02 cd (SEQUENCE : LENGTH(two byte): 02 cd >127 + ‘82’)

30 82 01 b5 (SEQUENCE : LENGTH(two byte): 01 b5 >127 + ‘82’)

02 01 00 (INTEGER : 0)

30 81 87 (SEQUENCE : LENGTH(one byte):87 >127 +‘81’)

31 0b (SET : LENGTH:0b <127)

30 09 (SEQUENCE : LENGTH:09 <127 )

06 03 55 04 06 (OBJECT IDENTIFIE countryName)

13 02 (PrintableString:LENGTH:02)

47 42 (GB)

31 16 (SET : LENGTH:16 <127)

30 14 (SEQUENCE : LENGTH:14 <127 )

06 03 55 04 08 (OBJECT IDENTIFIE stateOrProvinceName)

13 0d (PrintableString:LENGTH:0d)

53 74 61 66 66 6f 72 64 73 68 69 72 65 (Staffordshire)

 

31 17 (SET : LENGTH:17 <127)

30 15 (SEQUENCE : LENGTH:15 <127 )

06 03 55 04 07 (OBJECT IDENTIFIE localityName)

13 0e (PrintableString:LENGTH:0e)

53 74 6f 6b 65 20 6f 6e 20 54 72 65 6e 74(Stoke on Trent)

 

31 23 (SET : LENGTH:23 <127)

30 21 (SEQUENCE : LENGTH:21 <127 )

06 03 55 04 0a (OBJECT IDENTIFIE organizationName)

13 1a (PrintableString:LENGTH:1a)

52 65 64 20 4b 65 73 74 72 65 6c 20 43 6f 6e 73 (Red Kestrel Consulting Ltd)

75 6c 74 69 6e 67 20 4c 74 64

 

31 22 (SET : LENGTH:22 <127)

30 20 (SEQUENCE : LENGTH:20 <127 )

06 03 55 04 03 (OBJECT IDENTIFIE commonName)

13 19 (PrintableString:LENGTH:19)

74 65 73 74 63 65 72 74 2e 72 65 64 6b 65 73 74 (testcert.redkestrel.co.uk)

72 65 6c 2e 63 6f 2e 75 6b

 

30 82 01 22 (SEQUENCE : LENGTH(two byte): 01 22 >127 + ‘82’)

30 0d (SEQUENCE : LENGTH:0d <127 )

06 09 2a 86 48 86 f7 0d 01 01 01 (OBJECT IDENTIFIER rsaEncryption)

05 00 (NULL)

 

03 82 01 0f (BIT STRING: LENGTH(two byte): 01 0f >127 + ‘82’)

00(表示位串末字节填充0的个数)

30 82 01 0a(SEQUENCE : LENGTH(two byte): 01 0a >127 + ‘82’)

02 82 01 01 (INTEGER : LENGTH(two byte): 01 01 >127 + ‘82’)

00 (正整数标识)

d6 2d e5 bc f0 87 80 21 ad e7 db 74 7d f6 2f 3b

e1 f8 74 8d eb 5f f9 24 ec 18 f8 24 7c 65 c6 27

ef ad 72 52 86 93 73 09 13 48 a3 0f 83 cd 6b 11

97 50 23 54 2e 09 f6 44 ec b2 6e 6e 6c 4e 61 b3

a4 43 83 fb 50 00 03 25 7e a4 b4 28 14 d9 07 10

5b ae 74 6a 95 33 a5 e4 3d 67 ea 68 cd af 2a f7

73 51 b3 cf 0b 45 ff 31 f0 c5 18 fc 5c f0 06 37

4d 43 37 f3 97 3d 73 df d6 38 81 7a 35 47 00 bc

01 48 40 5d 33 1b b7 af cc 96 41 a8 36 f8 7a 75

27 6a d3 12 2c 79 b1 45 63 22 d4 97 87 b5 f2 c8

35 78 4d 8a d1 de c0 44 16 80 80 77 8f 5c 66 87

b0 8f 3b 91 5e 4d be 87 cd 00 f1 73 e7 fb b8 c8

ac 63 ab 3d 27 f3 e1 dc 67 8e 09 e2 03 a2 8a 94

f2 39 df 57 97 86 13 32 0c 1f 90 85 31 98 da 8e

b3 4a 17 80 d8 2b 76 11 c9 42 34 2b ae be bf 42

88 2e 85 27 b4 4b 3e f8 cd b4 2e 13 a7 f9 51 3d

02 03 (INTEGER : LENGTH 03)

01 00 01 (公钥指数)

a0 00(??)

30 0d (SEQUENCE : LENGTH 0d)

06 09 2a 86 48 86 f7 0d 01 01 05(OBJECT IDENTIFIER sha1WithRSAEncryption)

05 00 (NULL)

03 82 01 01 (BIT STRING: LENGTH(two byte): 01 01 >127 + ‘82’)

00(表示位串末字节填充0的个数)

51 61 3b a0 15 f7 48 b8 d8 34 ce 77 6e c0 4e

94 d1 a7 b2 00 29 d4 fd 5f 88 23 e9 10 a6 99 18

43 94 27 6c 4e 82 e2 07 4a ed 4d d5 98 a0 2a 95

a6 88 00 19 c6 ea 1a 81 6d 51 fc 03 4c de 35 e9

bc 22 d5 05 1b f8 d0 01 c2 16 ca 2d f6 e7 6b 74

26 23 23 8d da 0c 70 1a 62 f2 e6 4f 8f cf be 99

ed 72 7d 3f ef e8 3f fd e9 40 1e 1a fd 50 8a 28

31 9c 30 c2 8e b2 a2 6e bb 27 07 f0 fd b7 bf 83

b3 1a 7b b9 8f 1d 9d a5 b1 04 d2 d3 68 44 7a a5

72 9c 84 64 d9 6f 66 79 05 0b ae df bf 6a da 20

d2 6a 89 48 1c 74 5a cc 2d 1e 58 93 73 e9 d7 16

94 2b c0 52 04 cd 5b 8f 18 23 95 c3 b2 e6 09 f3

66 1c d0 a4 65 5b 91 48 90 7f f4 c7 4b 9a b7 f0

72 13 c8 dc d7 93 19 27 be 05 97 ec 3a da 6d db

fe e3 f9 ba 9e 60 a1 6e f0 1d 2c b4 ba 09 04 49

e2 87 15 28 57 5f 2e 64 e9 8e 7a e5 6e 5f 53 7a

9c

 

posted @ 2016-07-28 14:30  万物共鸣  阅读(3932)  评论(0编辑  收藏  举报