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