天将降大任于是人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。
——战国·孟子·《生于忧患,死于安乐》
上一小节,我们学习了非对称加密,掌握了密钥协商,数据签名等典型应用场景。现在,我们继续讨论身份认证话题,学习数字证书(certificate)的工作原理。
在介绍密钥协商时,我们提到服务器先将公钥发给客户端,用公钥保护对称加密密钥,确保通信内容不会被第三方获悉。但如果客户端连接的服务器是假的呢?如果用户对假网站信以为真,输入了账号密码,那么这些敏感信息都会被假网站窃取!
这种假网站被叫做钓鱼网站(phishingsite),它们高仿原网站,以假乱真。用户仅凭外观通常难以区分,因此信以为真。在钓鱼网站上输入的账号密码,最终都会被架设网站的黑客收集到。
那么,客户端应该如何判断服务器真伪呢?如何识别钓鱼站点呢?
上节我们也讨论了数字签名,通过它可以实现数据防伪。那么,我们是不是可以利用这项技术来甄别仿冒站点呢?显然,若有权威机构(如政府)担起站点信息签名的责任,即可轻松识别仿冒站点!
你可能会觉得,黑客直接盗用站点信息和签名不就可以伪造原站点了嘛?此言差矣!因为公钥属于站点信息的一部分,也会参与签名!客户端和服务端协商密钥时,会使用这个公钥加密密钥。由于黑客不掌握站点私钥,因此加密连接无法建立!黑客把公钥替换成自己的吧,签名就不对,肯定会被验出来!
由域名、运营单位以及公钥等组成的站点信息,加上权威机构生成的数字签名,就构成了本节的主角——数字证书(certificate)。HTTPS协议正是利用数字证书技术,来实现站点身份验证的。
您可能会说,如果权威机构的公钥被人调包,那数字证书也就不起保护作用了。确实如此!不过,权威机构的公钥通常以根证书的形式预装在操作系统里面,黑客很难对它做手脚。这也从层面说明使用正版系统的重要性,因为盗版系统很有可能会被人做手脚。
首先,权威机构需要生成一对密钥,对应图中红色那对(pem文件):
1opensslgenrsa-outcakey.pem2048然后,生成根证书签发申请文件(csr文件):
1opensslx509-req-days3650-sha1-extensionsv3_ca-signkeycakey.pem-inca.csr-outca.cer这一步生成的cer文件就是根证书文件,它的主要作用是承载权威机构公钥,以便预装在操作系统或者其他终端。它同样会包含权威机构的信息,公钥,以及对应的签名。
首先,站点管理员生成一对密钥,对应图中黄色那对:
1opensslgenrsa-outsitekey.pem2048然后,生成证书签发申请文件(csr文件):
opensslreq-new-keysitekey.pem-outsite.csr-subj'/C=CN/ST=Guangdong/L=Guangzhou/O=fasionchan/OU=website/CN=fasionchan.com'同样,证书申请文件包含站点信息和公钥,不再赘述。站点管理员将证书申请文件发给权威机构审核,对应图示中的步骤②。
权威机构对申请进行审核,审核通过则用自己的私钥对它进行签名,生成证书(cer文件):
1opensslx509-req-days365-sha1-extensionsv3_req-CAca.cer-CAkeycakey.pem-CAserialca.srl-CAcreateserial-insite.csr-outsite.cer证书中保存着包括公钥在内的站点信息,以及权威机构对这些信息的签名(图示步骤③)。管理员接到权威机构颁发的证书,就可以部署网站了。
客户端浏览器访问站点,服务端会将其证书发给客户端。客户端先对证书签名进行验证,步骤如下:
调用openssl工具,一行命令即可完成签名验证:
1opensslverify-CAfileca.cersite.cer总结数字证书是支撑互联网身份认证的重要技术手段,可以简单理解成经过CA权威结构签名认证过的站点信息。由于经过CA签名,第三方无法通过伪造手段冒充身份。