对称加密解决了信息传输的安全问题,但是引出了密钥配送问题。
非对称加密通过公钥加密、私钥解密的方式,避免了密钥在配送过程中被盗取。
但使用了非对称加密,就真的高枕无忧了吗?
当然不是!
有这样一句话不知道你是否听过:网络时代,你连屏幕对面是人是狗都不知道!
设想熊小猫正和兔小白在网络上通过公钥加密的方式聊天,熊小猫怎么确定对面的人真的是兔小白呢?
你可能会回答我:熊小猫用兔小白的公钥加密信息,假的兔小白没有兔小白私钥是无法解密的,那么也不可能和熊小猫聊天。
通信过程如下图:
没错,这就是公钥加密的特性。但是你有没有思考过,熊小猫手中用来加密信息的的 “兔public key" 是如何得来的?
嗯,一定是 “兔小白” 发给他的。而问题恰恰就出在这里。
熊小猫手里的公钥有没有可能并不是兔小白的公钥?是不是细思极恐,后背发凉?
假如攻击者伪装成兔小白,把他的公钥发给了熊小猫,那么会发生什么事情呢?
熊小猫使用假冒兔小白的公钥对信息加密。而攻击者随后截获他发出的任何信息,都可以用自己的私钥解密!!熊小猫的小秘密完全被暴露了!
攻击者利用了非对称加密公钥公开的特性,伪装成通信方施加攻击。
问题已经非常清晰:熊小猫如何验证拿到的公钥就是兔小白的公钥?换句话讲,兔小白如何证明他就是他?
铺垫了这么多,今天的主角要登场了!证书,就是用来证明公钥身份合法性的。
证书是能够证明你身份的文件。最常见的就是身份证。你去检测核酸,怎么证明你就是你,而不是别人替你来检查?你需要出示身份证,经过验证后才能检测核酸。
我们看看身份证上都有什么有用的信息。
身份证用来证明人的合法身份,公钥证书证明公钥的合法性。证书上的信息其实和身份证差不多,我们做个对比。
身份证姓名:对应证书的公钥所有者
身份证号:通信方公钥
身份证签发机关:证书颁发者
身份证有效期限:证书有效期
身份证防伪条纹:认证机构对公钥的签名
通信开始前,熊小猫需要从可信赖的证书机构手中拿到兔小白的公钥证书,而不是从自己声称自己为 “兔小白“ 的人手中获得。增加这个环节,是为了确保你拿到的公钥真的是通信人的公钥。
通过下图来说明证书的使用流程。
这个过程有如下几步:
引入证书以及如此复杂的流程,是为了解决公钥密钥的信任问题。
引入证书后,除了通信双方,出现了第三方----“认证机构”。认证机构主要负责证书的生成和管理。
认证机构会对申请证书的用户身份进行认证。认证通过后,对其公钥进行签名,按照证书格式规范生成证书。
如果兔小白的私钥泄露了,那么兔小白需要立即更改自己的私钥和公钥,作废之前的证书并生成新的证书。
作废的证书需要让所有与之通信的人知晓。否则熊小猫仍旧使用作废的证书加密,攻击者可以拿兔小白的私钥为所欲为。
认证机构一般是通过黑名单的方式作废证书。所有作废的证书会保存到证书作废清单(CRL),全称为Certificate Revocation List。
熊小猫需要从认证机构手中拿到最新的CRL,并且验证兔小白的证书是否已经作废。如果已经作废,熊小猫需要更新兔小白的证书,使用新的公钥加密信息。
证书中除了有兔小白的公钥信息,还有认证机构对兔小白公钥生成的签名。目的一是为了确保签名不被篡改,二是确保该证书确实是该认证机构颁发的。
熊小猫拿到证书后需要用认证机构的公钥对兔小白公钥签名进行验证。
证书为了解决消息接收方公钥的信任问题而出现。但证书中又引入了认证机构的公钥用来验签。
现在问题来了。认证机构公钥的信任问题又应如何解决呢?如果这是一家攻击者伪装的认证机构,那么这一套复杂的认证机制岂不是白费?
其实这样的例子在生活中是真实存在的。
商品有一种常见的防伪方式:防伪码。消费者刮开商品的防伪码,到对应的网站查询验证真伪。例如名贵白酒有使用这种方式。
造假商的对策是也搭建一套验证真伪的网站。网址和正规网站非常相近,页面高仿正规网站。消费者很难察觉到异常,在假网站验证假酒,得到正品的验证结果。
这个例子的底层问题是一样的:如何验证认证机构的真伪?
为了解决这个问题,认证机构引入了层级的概念。
我们还以防伪码的例子解释认证机构层级。为了确保消费者不被假的认证网站所欺骗,国家搭建了一套验证防伪网站真伪的网站。你只需要输入认证网站的网址进行查询,就能知道此网站的真伪。
消费者为了验证酒的真假,需要按如下流程操作
这两个网站形成了层级:A网站验证B网站真伪,B网站验证防伪码的真伪。
证书也是如此。每个认证机构的公钥都要由上一级认证机构颁发证书并提供验证。但这个链条不能无止境的延伸下去,一定会有终点。终点的认证机构是最高级别的认证机构,称为 根 CA。根 CA 自己给自己颁发证书,自己对自己的公钥进行签名。
你仍旧不信任根 CA?抱歉,你也只能信任根CA。
认证机构的层级是为了解决认证机构的信任问题。但其实信任问题并没有被完全解决。回到假酒验证的例子上,验证防伪网站真伪的A网站,我为什么会信任它呢?这个网站会不会也是假的?
证书验证的链条总有尽头,最终会落到根CA。你只能选择信任根CA,他说自己是真的就是真的。
但是这安全吗?我们需要再看看为什么会产生信任。
以我个人网购的经历为例。在天猫出现前,淘宝上经常会买到假货。所以我曾经只在京东买大件电子产品。那么我为什么信任京东呢?好像潜移默化的就产生了信任。之前并没有仔细想过这个问题,现在总结有如下原因:
由于这些原因我选择信任京东,在上面购买大件电子产品。这些让我信任的情报累加,不断加强了我的信任感。从不信任到将信将疑,最终到充分信任。
回到证书上,我们选择一款浏览器时一般会通过自己的经验、朋友推荐、广告宣传、公司知名度做出选择。信任了这款浏览器那么也可以认为信任了这款浏览器内置的证书。从而信任了整个认证机构链条。
但问题往往就出现在 “信任” 上。想一想你的 Chrome 浏览器是从官方网站下载的吗?有没有可能是伪造或者被篡改的 Chrome?
我之所以信任我的chrome浏览器,因为它是我用Mac电脑自带的Safari浏览器打开google的官方网站下载的。伪造的概率已经非常低。
当你已经小心翼翼,收集各种情报做出了判断,那么你就只能选择相信。没有绝对的安全。
证书的出现是为了解决通信方公钥的信任问题。但同时引出了认证机构的公钥信任问题。虽然存在认证机构层级认证,但并不彻底解决信任问题。最终我们回归本源,看看信任是如何产生的。此时我们发现,本来就没有绝对可靠的信任,我们收集大量信息,只能不断提高可信程度。最终,基于大量的可信信息,我们也只能选择信任。