上一小节,我们学习了非对称加密,掌握了密钥协商,数据签名等典型应用场景。现在,我们继续讨论身份认证话题,学习 数字证书( certificate )的工作原理。
概念回顾
- 信息摘要( digest ),数据经过哈希算法得到的一串哈希值,代表数据的特征,也称为数据指纹;
- 摘要算法 ,可以把任意长度的数据,映射成一个定长的字符串(哈希值);
- 由于哈希冲突的存在,两份不同的数据,有可能算出相同的摘要值;
- 摘要算法无法用于数据加密,通常用来校验数据完整性,即 数据防伪 ;
- 常见的摘要算法有:MD5 、SHA1 、SHA256 、SHA512 。
- 数字签名( signature ),摘要由私钥加密后,得到的摘要密文就是数字签名;
- 签名,由数据发送方生成,这是一个 加密 过程(使用私钥);
- 验签,由数据接收方校验,这是一个 解密 过程(使用公钥);
- 数字签名只能由私钥生成,因此第三方无法伪造;
数字证书
在介绍密钥协商时,我们提到服务器先将公钥发给客户端,用公钥保护对称加密密钥,确保通信内容不会被第三方获悉。但如果客户端连接的服务器是假的呢?如果用户对假网站信以为真,输入了账号密码,那么这些敏感信息都会被假网站窃取!
这种假网站被叫做 钓鱼网站( phishing site ),它们高仿原网站,以假乱真。用户仅凭外观通常难以区分,因此信以为真。在钓鱼网站上输入的账号密码,最终都会被架设网站的黑客收集到。
那么,客户端应该如何判断服务器真伪呢?如何识别钓鱼站点呢?
上节我们也讨论了数字签名,通过它可以实现数据防伪。那么,我们是不是可以利用这项技术来甄别仿冒站点呢?显然,若有权威机构(如政府)担起站点信息签名的责任,即可轻松识别仿冒站点!
- 权威机构生成一对密钥,并提供站点认证审核和数字签名颁发服务;
- 站点管理员将站点信息,包括域名、运营单位、公钥等信息发给权威机构审核;
- 权威机构对提交上来的站点信息进行审核,审核通过则用私钥签名后返回给站点管理员;
- 客户端(浏览器)连接站点服务器,服务器将站点信息以及对应的数字签名发给客户端;
- 客户端用权威机构提供的公钥来校验数字签名,即可判断站点信息的真伪性;
- 签名验证通过,客户端从站点信息中取出公钥,与服务端协商密钥,发起加密通信;
- 由于签名用的私钥只有权威机构掌握,黑客无法伪造数字签名,也就无法架设仿冒站点;
- 权威机构必须由可信的单位运营;
你可能会觉得,黑客直接盗用站点信息和签名不就可以伪造原站点了嘛?此言差矣!因为公钥属于站点信息的一部分,也会参与签名!客户端和服务端协商密钥时,会使用这个公钥加密密钥。由于黑客不掌握站点私钥,因此加密连接无法建立!黑客把公钥替换成自己的吧,签名就不对,肯定会被验出来!
由域名、运营单位以及公钥等组成的站点信息,加上权威机构生成的数字签名,就构成了本节的主角—— 数字证书( certificate )。HTTPS 协议正是利用数字证书技术,来实现站点身份验证的。
您可能会说,如果权威机构的公钥被人调包,那数字证书也就不起保护作用了。确实如此!不过,权威机构的公钥通常以根证书的形式预装在操作系统里面,黑客很难对它做手脚。这也从层面说明使用正版系统的重要性,因为盗版系统很有可能会被人做手脚。
证书签发实验
CA权威机构
首先,权威机构需要生成一对密钥,对应图中红色那对( pem 文件 ):
|
|
然后,生成根证书签发申请文件( csr 文件):
|
|
证书申请文件包含权威机构的信息,包括机构信息( Subject )和公钥( Public Key 部分 ):
|
|
最后,自签根证书( cer 文件 ):
|
|
这一步生成的 cer 文件就是根证书文件,它的主要作用是承载权威机构公钥,以便预装在操作系统或者其他终端。它同样会包含权威机构的信息,公钥,以及对应的签名。
商业站点(服务端)
首先,站点管理员生成一对密钥,对应图中黄色那对:
|
|
然后,生成证书签发申请文件( 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 文件 ):
|
|
证书中保存着包括公钥在内的站点信息,以及权威机构对这些信息的签名(图示步骤③)。管理员接到权威机构颁发的证书,就可以部署网站了。
浏览器(客户端)
客户端浏览器访问站点,服务端会将其证书发给客户端。客户端先对证书签名进行验证,步骤如下:
- 重新对证书中的站点信息计算 摘要值 ;
- 用公钥对证书中的签名进行解密,得到证书的原始摘要值;
- 公钥通常由根证书提供,根证书通常预装在系统里;
- 对比两个摘要值看是否一致;
调用 openssl 工具,一行命令即可完成签名验证:
|
|
总结
数字证书是支撑互联网身份认证的重要技术手段,可以简单理解成经过 CA 权威结构签名认证过的站点信息。由于经过 CA 签名,第三方无法通过伪造手段冒充身份。
- 证书由站点信息和 CA 签名组成,站点信息包含站点公钥,公钥用于协商对称加密密钥;
- 证书由 CA 权威机构审核签发,签名用的是 CA 的私钥;
- CA 公钥通常以根证书形式预装在系统内,客户端通过它来验证证书签名;
- 有了数字签名,黑客无法对证书进行篡改,也无法伪造证书,因此无法部署仿冒站点;
- 若只窃取原站点证书,不做篡改,客户端使用真实站点的公钥,而黑客无法掌握站点私钥,因此加密连接无法建立;
- 如果篡改原站点证书,换上自己的公钥,但因为没有 CA 私钥无法生成合法签名,也会被识别出来;
【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: