数字证书身份认证原理与签发步骤详解

上一小节,我们学习了非对称加密,掌握了密钥协商,数据签名等典型应用场景。现在,我们继续讨论身份认证话题,学习 数字证书certificate )的工作原理。

概念回顾

  • 信息摘要digest ),数据经过哈希算法得到的一串哈希值,代表数据的特征,也称为数据指纹;
  • 摘要算法 ,可以把任意长度的数据,映射成一个定长的字符串(哈希值);
    • 由于哈希冲突的存在,两份不同的数据,有可能算出相同的摘要值;
    • 摘要算法无法用于数据加密,通常用来校验数据完整性,即 数据防伪
    • 常见的摘要算法有:MD5SHA1SHA256SHA512
  • 数字签名signature ),摘要由私钥加密后,得到的摘要密文就是数字签名;
    • 签名,由数据发送方生成,这是一个 加密 过程(使用私钥);
    • 验签,由数据接收方校验,这是一个 解密 过程(使用公钥);
    • 数字签名只能由私钥生成,因此第三方无法伪造;

数字证书

在介绍密钥协商时,我们提到服务器先将公钥发给客户端,用公钥保护对称加密密钥,确保通信内容不会被第三方获悉。但如果客户端连接的服务器是假的呢?如果用户对假网站信以为真,输入了账号密码,那么这些敏感信息都会被假网站窃取!

这种假网站被叫做 钓鱼网站phishing site ),它们高仿原网站,以假乱真。用户仅凭外观通常难以区分,因此信以为真。在钓鱼网站上输入的账号密码,最终都会被架设网站的黑客收集到。

那么,客户端应该如何判断服务器真伪呢?如何识别钓鱼站点呢?

上节我们也讨论了数字签名,通过它可以实现数据防伪。那么,我们是不是可以利用这项技术来甄别仿冒站点呢?显然,若有权威机构(如政府)担起站点信息签名的责任,即可轻松识别仿冒站点!

  1. 权威机构生成一对密钥,并提供站点认证审核和数字签名颁发服务;
  2. 站点管理员将站点信息,包括域名、运营单位、公钥等信息发给权威机构审核;
  3. 权威机构对提交上来的站点信息进行审核,审核通过则用私钥签名后返回给站点管理员;
  4. 客户端(浏览器)连接站点服务器,服务器将站点信息以及对应的数字签名发给客户端;
  5. 客户端用权威机构提供的公钥来校验数字签名,即可判断站点信息的真伪性;
  6. 签名验证通过,客户端从站点信息中取出公钥,与服务端协商密钥,发起加密通信;
  7. 由于签名用的私钥只有权威机构掌握,黑客无法伪造数字签名,也就无法架设仿冒站点;
  8. 权威机构必须由可信的单位运营;

你可能会觉得,黑客直接盗用站点信息和签名不就可以伪造原站点了嘛?此言差矣!因为公钥属于站点信息的一部分,也会参与签名!客户端和服务端协商密钥时,会使用这个公钥加密密钥。由于黑客不掌握站点私钥,因此加密连接无法建立!黑客把公钥替换成自己的吧,签名就不对,肯定会被验出来!

由域名、运营单位以及公钥等组成的站点信息,加上权威机构生成的数字签名,就构成了本节的主角—— 数字证书certificate )。HTTPS 协议正是利用数字证书技术,来实现站点身份验证的。

您可能会说,如果权威机构的公钥被人调包,那数字证书也就不起保护作用了。确实如此!不过,权威机构的公钥通常以根证书的形式预装在操作系统里面,黑客很难对它做手脚。这也从层面说明使用正版系统的重要性,因为盗版系统很有可能会被人做手脚。

证书签发实验

CA权威机构

首先,权威机构需要生成一对密钥,对应图中红色那对( pem 文件 ):

1
openssl genrsa -out cakey.pem 2048

然后,生成根证书签发申请文件( csr 文件):

1
openssl req -new -key cakey.pem -out ca.csr -subj '/C=CN/ST=Guangdong/L=Guangzhou/O=coding-fans/OU=CA/CN=ca.fasionchan.com'

证书申请文件包含权威机构的信息,包括机构信息( Subject )和公钥( Public Key 部分 ):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
openssl req -in ca.csr -text -noout                                                                                        
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=CN, ST=Guangdong, L=Guangzhou, O=coding-fans, OU=CA, CN=ca.fasionchan.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (2048 bit)
                Modulus:
                    00:9a:b9:3e:a6:85:a9:90:16:56:d1:df:ee:50:cd:
                    b9:6f:92:0e:55:ac:50:db:42:b2:06:80:7e:5a:b7:
                    b3:ff:e2:45:64:50:83:ee:84:87:c3:da:b4:e9:8d:
                    a6:d0:34:0a:8a:15:b8:f2:78:4e:cc:e9:98:8e:1b:
                    0f:09:51:00:47:b9:c0:77:a1:98:1e:af:7e:7f:28:
                    29:a3:10:aa:70:e7:73:24:26:25:bb:9e:a6:bd:ee:
                    fc:63:c4:3d:a3:f2:92:69:c3:aa:12:15:90:f2:a5:
                    0f:a8:62:9d:03:e3:1a:49:65:69:0f:cd:17:20:03:
                    5e:54:f8:e3:69:f7:d9:86:e4:0b:10:d5:4e:67:ef:
                    bd:fb:4e:13:88:92:4b:fe:3b:09:68:36:a3:96:d3:
                    9e:f2:92:5b:03:83:52:3d:c7:30:41:cb:29:42:25:
                    cf:b9:ca:1b:8d:c9:df:a5:1b:cc:87:27:19:3f:0a:
                    d1:da:71:f3:6f:26:a1:44:b2:12:57:18:94:5f:53:
                    5e:a9:b0:b2:6b:31:5b:ce:44:52:07:f7:b4:c7:a2:
                    d3:5b:88:34:bf:dd:61:78:b6:e7:a5:df:39:60:ad:
                    37:48:85:c3:28:69:97:7f:5d:ed:09:93:e3:6f:91:
                    8f:d7:d1:21:18:4b:d8:11:1b:5e:7e:e1:4d:70:ec:
                    26:ff
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         31:f7:8d:41:87:13:c1:66:a9:ea:d5:ac:57:d7:0d:33:2b:10:
         21:12:33:58:3b:40:8b:9d:6a:b2:dd:1f:50:e6:c7:92:d3:10:
         43:72:40:14:1a:63:33:4d:55:1f:1c:ce:ce:27:aa:d3:22:3a:
         a3:bc:bb:53:97:b9:7f:c4:66:53:35:59:5f:88:6c:35:ad:49:
         6b:b8:14:60:f8:42:8b:2a:9a:e9:59:00:b3:00:b7:c8:53:44:
         53:81:f8:f3:51:12:3b:4c:6a:4f:ce:be:45:7f:b7:14:d5:53:
         35:d4:71:88:05:f3:1b:0d:3a:cf:7a:66:60:19:ac:90:81:96:
         1f:e0:7f:f7:d2:be:08:77:a9:7e:70:8d:87:40:98:aa:5e:4b:
         f1:8b:d7:58:7d:64:02:56:4c:55:92:99:1d:b1:af:8b:7a:09:
         c1:0e:0d:d7:0e:a1:f1:1a:04:66:c7:c7:28:f5:b7:71:51:36:
         ab:fb:4e:a3:9c:d8:ec:69:f0:c4:54:5c:69:a6:59:22:a0:d6:
         4f:04:3a:41:35:95:ed:c5:4a:63:11:13:43:0e:54:a9:51:a5:
         31:54:34:74:9a:6d:8f:25:44:c1:42:ae:3c:bf:a6:f9:4d:c9:
         fa:43:fd:d6:0c:fc:86:e4:f9:18:96:a7:50:64:b8:cc:37:4a:
         37:91:96:4e

最后,自签根证书( cer 文件 ):

1
openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey cakey.pem -in ca.csr -out ca.cer

这一步生成的 cer 文件就是根证书文件,它的主要作用是承载权威机构公钥,以便预装在操作系统或者其他终端。它同样会包含权威机构的信息,公钥,以及对应的签名。

商业站点(服务端)

首先,站点管理员生成一对密钥,对应图中黄色那对:

1
openssl genrsa -out sitekey.pem 2048

然后,生成证书签发申请文件( csr 文件):

openssl req -new -key sitekey.pem -out site.csr -subj '/C=CN/ST=Guangdong/L=Guangzhou/O=fasionchan/OU=website/CN=fasionchan.com'

同样,证书申请文件包含站点信息和公钥,不再赘述。站点管理员将证书申请文件发给权威机构审核,对应图示中的步骤②。

权威机构对申请进行审核,审核通过则用自己的私钥对它进行签名,生成证书( cer 文件 ):

1
openssl x509 -req -days 365 -sha1 -extensions v3_req -CA ca.cer -CAkey cakey.pem -CAserial ca.srl -CAcreateserial -in site.csr -out site.cer

证书中保存着包括公钥在内的站点信息,以及权威机构对这些信息的签名(图示步骤③)。管理员接到权威机构颁发的证书,就可以部署网站了。

浏览器(客户端)

客户端浏览器访问站点,服务端会将其证书发给客户端。客户端先对证书签名进行验证,步骤如下:

  • 重新对证书中的站点信息计算 摘要值
  • 用公钥对证书中的签名进行解密,得到证书的原始摘要值;
    • 公钥通常由根证书提供,根证书通常预装在系统里;
  • 对比两个摘要值看是否一致;

调用 openssl 工具,一行命令即可完成签名验证:

1
openssl verify -CAfile ca.cer site.cer

总结

数字证书是支撑互联网身份认证的重要技术手段,可以简单理解成经过 CA 权威结构签名认证过的站点信息。由于经过 CA 签名,第三方无法通过伪造手段冒充身份。

  • 证书由站点信息和 CA 签名组成,站点信息包含站点公钥,公钥用于协商对称加密密钥;
  • 证书由 CA 权威机构审核签发,签名用的是 CA 的私钥;
  • CA 公钥通常以根证书形式预装在系统内,客户端通过它来验证证书签名;
  • 有了数字签名,黑客无法对证书进行篡改,也无法伪造证书,因此无法部署仿冒站点;
    • 若只窃取原站点证书,不做篡改,客户端使用真实站点的公钥,而黑客无法掌握站点私钥,因此加密连接无法建立;
    • 如果篡改原站点证书,换上自己的公钥,但因为没有 CA 私钥无法生成合法签名,也会被识别出来;

小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: