前言
在聊HTTPS之前,我们先来聊一下HTTP,HTTP的一些相关知识点:HTTP协议详解,HTTP在传输过程中,它的数据是透明的,也就是说任何人都可以在中间截获请求与响应,从而盗取一些用户的重要信息。
首先数据在传输的过程中,数据可能被中间人抓包拿到,那么数据就会被中间人窃取。
其次数据被中间人拿到后,中间人可能对数据进行修改或者替换,然后发往服务器。
最后服务器收到数据后,也无法确定数据有没有被修改或替换,当然,如果服务器也无法判断数据就真的是来源于客户端。
为了解决这些问题,HTTPS应运而生。
1、对称加密
为了解决HTTP的不安全问题,我们需要对HTTP进行加密,那么如何进行加密呢?我们先来了解一些对称加密算法。
对称加密算法中,加密和解密都使用同一个秘钥,黑客如果没有得到秘钥,是无法查看到数据的。
如果服务器和客户端使用对称加密算法进行数据的传输,就必须先协商好使用什么秘钥,那在刚开始协商秘钥的过程中,秘钥就有可能被黑客劫持。这样之后的通信黑客就可以拿着秘钥对数据进行解密从而获取到数据内容。所以对称算法并不能很好的解决HTTP的安全问题。
二、非对称加密
基于对称加密的问题,非对称加密出现了。在非对称加密中,我们有两个密钥,分别是私钥和公钥。私钥是服务器私有的,别人都不知道,公钥是所有客户端共有的。
公钥加密的内容需要用私钥解密,私钥加密的内容需要用公钥解密。当服务器使用私钥对数据进行加密后,客户端可以通过公钥解锁获得内容;客户端使用公钥对数据进行加密后,只有服务器的私钥才能解锁获得内容,而私钥只有服务器才拥有,这样黑客就不能获取到客户端发送的信息,但仍可以截获服务器发送给客户端的数据。
使用了非对称算法后,黑客还是可以截取到服务器发送给客户端的数据,这时候我们就需要采用对称加密和非对称加密结合的方式:
在客户端获取到公钥后,将今后通信的
对称加密的密钥发送给服务器,服务器通过秘钥解锁获取到今后通信的密钥,然后接下去就采用对称加密的方式和客户端进行通信
这样还存在什么问题呢?
如果黑客在中间截获了请求,伪装成服务器与客户端进行通信,同时也伪装成客户端和服务器进行通讯,还是会造成数据的不安全问题:
三、数字证书
在上面的例子中,最核心的问题就在于公钥的真实性。如果我们可以获得到服务器真实的公钥,我们就能和服务器取得安全的联系。那么如何才能获得到真正的公钥呢?这时候就需要数字证书了,数字证书就相当于一张身份证,证明了服务器真实身份。
那么数字证书如何获取呢?这时候我们就需要向CA机构申请数字证书,服务器将自己的信息如域名、公司名称以及公钥发送给CA机构(当然不是免费的),由CA机构审核后颁发给服务器数字证书。
第一次通信时,服务器不再直接把自己的公钥发送给客户端,而是将数字证书发送给客户端。客户端拿到数字证书后,就需要验证证书是否能在CA机构中查到,并且核对证书的基本信息如证书上的域名是否与当前访问的域名一致等等,还可以拿到证书中服务器的公钥信息用于协商对称密钥。
证书颁发了,可是又怎么防止伪造,怎么保证在传输过程中不被篡改呢?万一小王截获到数字证书,把公钥改成自己的那不是依然无法保证安全了么?这就需要数字签名了!
四、数字签名
CA在拿到服务器申请数字证书的信息后,会选择一种单向Hash算法(比如说常见的MD5)对这些信息进行加密,加密之后的东西我们称之为摘要。
单向Hash算法有一种特点就是单向不可逆的,只要原始内容有一点变化,加密后的数据都将会是千差万别(当然也有很小的可能性会重复),这样就防止了信息被篡改。
生成摘要后还不算完,CA还会用自己的私匙对摘要进行加密,摘要加密后的数据我们称之为数字签名。
最后,CA将会把我们的申请信息(包含服务器的公匙)和数字签名整合在一起,由此而生成数字证书。然后CA将数字证书传递给我们。
这个时候服务器发送给客户端数字证书后,客户端就需要用CA的公匙解密数字证书并验证数字证书的合法性。那我们如何能拿到CA的公匙呢?我们的电脑和浏览器中已经内置了一部分权威机构的根证书,这些根证书中包含了CA的公匙。
客户端用CA机构的公钥对对数字证书进行解密,如果解密成功,则说明证书来源于合法的认证机构。解密成功后,客户端就拿到了摘要。此时,客户端会使用与CA机构一致的Hash算法将申请信息生成一份摘要同时和数字证书中的摘要进行对比,如果内容相同说明没有被篡改。最后客户端安全的从证书中拿到服务器的公匙就可以和服务器进行安全的非对称加密通信了。
在这个过程中,因为黑客没有CA机构的秘钥,所以不能对数字证书进行修改,如果将数字证书中的信息进行修改,那么客户端生成的摘要就会和数字证书中的信息不相同,客户端从而得知这是不安全的。
最后通过一张图来理解流程:
五、总结
HTTPS=HTTP+SSL,在 HTTP 层和 TCP 之间加了一个 SSL/TLS 层。
SSL(Secure Sockets Layer)中文叫“安全套接层”,后来由于广泛应用,SSL 标准化之后就改名为 TLS(Transport Layer Security)了。
HTTPS就是通过我们上面所说的数字证书的方法来实现数据安全的。