非对称算法很好地解决了对称算法存在的问题:无法安全交换密钥 。服务器的公钥可以公开给所有的用户,当客户端首次访问服务器,服务器便把公钥返回即可。
但是对于非对称算法有一个很严重的缺点:性能极差 。所以我们可以将对称与非对称算法结合起来,解决上述问题。
对称+非对称对称算法存在的问题是无法安全地互换密钥;因此第一步我们可以使用非对称算法来交换密钥,后续使用对称算法来进行通信。如下图:
当客户访问服务器时,服务器返回一个公钥;
客户端拿到公钥之后,对客户端密钥使用公钥进行加密之后发送给服务端;
服务端拿到客户端密钥之后对服务端密钥进行加密发送给客户端;
这样就完成了双方密钥的交换,后续可以使用密钥进行高效率通信。
到此我们的网络传输依旧不是安全的,因为,我们无法保证第一步服务器返回的公钥不会被黑客篡改。假如黑客把服务器返回的公钥转换成自己的公钥,后续他就可以对客户端的的所有消息使用自己的私钥解密。而问题的本质在于:我们无法辨别返回的数据是否是真的由服务器返回的 。这个问题的解决方法就是:使用数字证书来证明信息发送方的身份 。
数字证书经过前面加密算法的讨论,对称+非对称算法已经可以解决大部分的网络安全问题。但第一步服务器返回的公钥仍旧有被黑客篡改的风险,因为我们无法确保通信对方的身份。数字证书的引入,就是为了解决这个问题。
证书概述数字证书是由公认的证书机构颁发给服务器的一个用于验证身份的数字认证。
数字证书可以用身份证来进行类比:
身份证是我们自身身份信息的一个认证,颁发的机构是我们全国人民认可的公安局。
同理,服务器的数字证书也是服务器身份的一个认证,颁发的机构是互联网中普遍认可的证书机构。
服务器的证书中,包含有服务器信息例如公钥等、证书签名、证书机构信息等。客户端拿到服务器的证书,进行证书验证后,就可以准确得到服务器的公钥,利用这个公钥,就可以实现上述的算法加密了。
总之,数字证书的作用就是证明数据的来源,安全获取到服务器的公钥进行加密通信 。
证书验证客户端如何验证服务器的证书呢?首先得看看证书是怎么做出来的:
服务器向证书机构申请证书,同时提供自己的域名、地址、公钥等信息;
证书机构对服务器的信息使用hash算法得出一份128位的摘要,并对这份摘要使用自己的私钥进行非对称加密得到证书数字签名。
证书机构把服务器信息(明文)+数字签名+证书机构信息(包含证书机构公钥)发送给服务器
客户端请求服务器时,服务器把证书返回给客户端
客户端验证证书的重点就是:比较摘要 :
客户端拿到证书,得到服务器信息、数字签名、证书机构信息
客户端对服务器信息进行hash算法计算得出一份摘要S1
客户端使用证书机构的公钥对数字签名进行解密得到一份摘要S2
对比S1和S2即可辨别此证书是否来自服务器且没经过篡改
经过上面的证书验证流程,客户端就可以成功拿到服务器的公钥,进行下一步的加密流程。至于为什么通过比较摘要即可知道证书安全,下面进行讨论。
证书链客户端验证证书的流程很简单:使用证书机构公钥解开证书的数字签名后进行比对即可。但这里有一个问题:如何保证证书机构的公钥可信 ?假如黑客使用自己的私钥加密,同时把证书机构的公钥修改成自己的公钥,那岂不是非常危险?