以X.509为例简要分析数字证书


数字证书利用现代密码学中的公钥密码技术,利用一对相互匹配的密钥进行加密、解密。每个用户自己设定一把特定的、仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一个向公众公开的公钥,用于公众加密和验证签名。当发送方发送一份保密文件时,使用接收方的公钥对数据加密,而接收方用自己的私钥解密,这样就可以实现信息的安全通信。

生成X.509数字证书大致过程如下:
(1)用户生成自己的服务端公私钥对;
(2)构造自己的证书申请文件,该文件主要包括了用户信息、公钥以及一些可选的属性信息
(3)用自己的私钥给该内容签名;
(4)用户将证书申请文件提交 CA;
(5)CA验证签名,提取用户信息,并加上其他信息(比如颁发者等信息),用 CA的私钥签发数字证书。

举个例子,Alice有一把公钥和一把私钥,Bob有Alice的公钥。 Alice给Bob写一封信,采用数据签名的方式,写完后用Hash函数,生成信件的摘要。然后用自己的私钥,给摘要加密,生成“数字签名”,Alice将这个签名附在信件后面,一起发给Bob。Bob收到信之后,可以用Alice的公钥解密信件摘要,证明这封信是Alice发的,然后对信件本身使用Hash函数将得到的结果与摘要对比,可以判断信件是否被修改过。然而,这样的机制并不能防止被中间攻击,如果有人冒充Alice,把Alice的公钥换成自己的公钥,然后告诉Bob,此时攻击者可以冒充Alice,用自己的私钥做“数字签名”,写信给Bob,让Bob用假的Alice公钥进行解密。因此需要一个CA,为公钥做认证。CA用自己的私钥,对Alice的公钥和一些相关信息一起加密,生成“数字证书”。这样,Alice在发信息给Bob的时候,只要附上数字证书,而Bob接到信件,用CA的公钥解开数字证书,就可以拿到Alice真实的公钥,也就能证明“数字签名”是不是真的Alice。同时,为了证明CA是真的CA,也需要一个“数字签名”,CA私钥加密,Bob公钥解密验证。

下面的X.509例子是一个自签名认证,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息,是用来证明自己身份的东西。带入上面的Alice和Bob的例子,就属于最后提到的“证明CA是真的CA”部分。
在签发者处,首先求出传递消息Info(这里可以认为是CA的公钥)的HASH值(利用SHA-1 hash algorithm,然后用私钥对Hash值进行加密(利用RSA),然后将原文Info和经过加密的Hash值一起发送给接收者(这里可以认为是Bob),接受者用签发者的公钥解密,然后对收到的Info原文计算Hash值,然后对比是否相同,相同,认证成功(证明是CA)。在数字证书里,需要附加CA对证书的签名,即CA用自己的私钥对数字证书进行数字签名(RSA),数字签名的结果存放在签名字段中,接收者(Bob)可以用CA的公钥解密,以确定CA是否有公证的能力。

该例子来自https://tools.ietf.org/html/rfc5280#appendix-C.1

C.1. RSA Self-Signed Certificate

This appendix contains an annotated hex dump of a 578 byte version 3
certificate. The certificate contains the following information:
(a) the serial number is 17;
(b) the certificate is signed with RSA and the SHA-1 hash algorithm;
(c) the issuer’s distinguished name is
cn=Example CA,dc=example,dc=com;
(d) the subject’s distinguished name is
cn=Example CA,dc=example,dc=com;
(e) the certificate was issued on April 30, 2004 and expired on
April 30, 2005;
(f) the certificate contains a 1024-bit RSA public key;
(g) the certificate contains a subject key identifier extension
generated using method (1) of Section 4.2.1.2; and
(h) the certificate is a CA certificate (as indicated through the
basic constraints extension).

0 574: SEQUENCE { //Certificate::SEQUENCE类型,数据块长度为574
4 423: SEQUENCE { //tbsCertificate:: SEQUENCE类型,长度423
8 3: [0] { //Version:: 特殊内容-证书版本
10 1: INTEGER 2
: }
13 1: INTEGER 17 //证书序列号17
16 13: SEQUENCE { //signature:: SEQUENCE类型
18 9: OBJECT IDENTIFIER
: sha1withRSAEncryption (1 2 840 113549 1 1 5)
//表示dsa-with-sha算法
//sha1RSA – 1.2.840.113549.1.1.5
29 0: NULL
: }
31 67: SEQUENCE { //For reasons of compatibility,
//implementations must also support domain components
//(domainComponent, DC) encoded in IA5String
33 19: SET {
35 17: SEQUENCE {
37 10: OBJECT IDENTIFIER
: domainComponent (0 9 2342 19200300 100 1 25)
49 3: IA5String ‘com’
: }
: }
54 23: SET {
56 21: SEQUENCE {
58 10: OBJECT IDENTIFIER
: domainComponent (0 9 2342 19200300 100 1 25)
70 7: IA5String ‘example’
: }
: }
79 19: SET {
81 17: SEQUENCE {
83 3: OBJECT IDENTIFIER commonName (2 5 4 3)
88 10: PrintableString ‘Example CA’
: }
: }
: }
100 30: SEQUENCE { //validity:: SEQUENCE类型(30),长度30
//the certificate was issued on April 30, 2004
//and expired on April 30, 2005;
102 13: UTCTime 30/04/2004 14:25:34 GMT
117 13: UTCTime 30/04/2005 14:25:34 GMT
: }
132 67: SEQUENCE {
134 19: SET {
136 17: SEQUENCE {
138 10: OBJECT IDENTIFIER //域组件
: domainComponent (0 9 2342 19200300 100 1 25)
150 3: IA5String ‘com’
: }
: }
155 23: SET {
157 21: SEQUENCE {
159 10: OBJECT IDENTIFIER
: domainComponent (0 9 2342 19200300 100 1 25)
171 7: IA5String ‘example’
: }
: }
180 19: SET {
182 17: SEQUENCE {
184 3: OBJECT IDENTIFIER commonName (2 5 4 3) //主体名/公用名
189 10: PrintableString ‘Example CA’
: }
: }
: }
201 159: SEQUENCE {
204 13: SEQUENCE {
206 9: OBJECT IDENTIFIER // 表示RSA算法,加密
: rsaEncryption (1 2 840 113549 1 1 1)
217 0: NULL
: }
//公钥值,BIT STRING类型,长度141字节
219 141: BIT STRING, encapsulates {
223 137: SEQUENCE {
226 129: INTEGER
: 00 C2 D7 97 6D 28 70 AA 5B CF 23 2E 80 70 39 EE
: DB 6F D5 2D D5 6A 4F 7A 34 2D F9 22 72 47 70 1D
: EF 80 E9 CA 30 8C 00 C4 9A 6E 5B 45 B4 6E A5 E6
: 6C 94 0D FA 91 E9 40 FC 25 9D C7 B7 68 19 56 8F
: 11 70 6A D7 F1 C9 11 4F 3A 7E 3F 99 8D 6E 76 A5
: 74 5F 5E A4 55 53 E5 C7 68 36 53 C7 1D 3B 12 A6
: 85 FE BD 6E A1 CA DF 35 50 AC 08 D7 B9 B4 7E 5C
: FE E2 A3 2C D1 23 84 AA 98 C0 9B 66 18 9A 68 47
: E9
358 3: INTEGER 65537 // RSA加密算法的exponent值
: }
: }
: }
363 66: [3] { //extensions:: 特殊内容-证书扩展部分
365 64: SEQUENCE {
367 29: SEQUENCE {
//证书包含一个使用者密钥标识符(subjectKeyIdentifier)扩展项
369 3: OBJECT IDENTIFIER subjectKeyIdentifier (2 5 29 14)
374 22: OCTET STRING, encapsulates { //扩展 subjectKeyIdentifier的值
376 20: OCTET STRING
: 08 68 AF 85 33 C8 39 4A 7A F8 82 93 8E 70 6A 4A
: 20 84 2C 32
: }
: }
398 14: SEQUENCE {
400 3: OBJECT IDENTIFIER keyUsage (2 5 29 15)
405 1: BOOLEAN TRUE //true,表示为CA证书
408 4: OCTET STRING, encapsulates {
410 2: BIT STRING 1 unused bits
: ‘0000011’B
: }
: }
414 15: SEQUENCE {
416 3: OBJECT IDENTIFIER basicConstraints (2 5 29 19)
//证书是一个CA证书(通过basicConstraints基本扩展项标识)
421 1: BOOLEAN TRUE
424 5: OCTET STRING, encapsulates {
426 3: SEQUENCE {
428 1: BOOLEAN TRUE
: }
: }
: }
: }
: }
: }
431 13: SEQUENCE {
433 9: OBJECT IDENTIFIER
: sha1withRSAEncryption (1 2 840 113549 1 1 5)
444 0: NULL
: }
446 129: BIT STRING //签名值
: 6C F8 02 74 A6 61 E2 64 04 A6 54 0C 6C 72 13 AD
: 3C 47 FB F6 65 13 A9 85 90 33 EA 76 A3 26 D9 FC
: D1 0E 15 5F 28 B7 EF 93 BF 3C F3 E2 3E 7C B9 52
: FC 16 6E 29 AA E1 F4 7A 6F D5 7F EF B3 95 CA F3
: 66 88 83 4E A1 35 45 84 CB BC 9B B8 C8 AD C5 5E
: 46 D9 0B 0E 8D 80 E1 33 2B DC BE 2B 92 7E 4A 43
: A9 6A EF 8A 63 61 B3 6E 47 38 BE E8 0D A3 67 5D
: F3 FA 91 81 3C 92 BB C5 5F 25 25 EB 7C E7 D8 A1
: }

猜你喜欢

转载自blog.csdn.net/qq_32335095/article/details/79590470