花了一下午去了解HTTPS,学完之后感觉很清楚很爽。
先来总结几个难点:
- SSL握手发生在TCP之后的原因
- 握手的前三次握手为什么每次都要传一个随机值?
- 有什么意义 怎么保证握手期间信息不泄露,不被篡改?
- 什么是摘要算法?
- 什么是数字签名算法?
- 什么是数字证书?
- 怎么知道信息有没有被篡改?
- 怎么知道它给我的数字证书是不是我想要的服务器的?
一一来回答:
- 因为SSL握手也是在进行数据传输,就跟HTTP传输数据之前为什么要先TCP连接一样,因为建立连接之后才能进行稳定可靠的数据传输,不然可能数据根本就到不了对方那。
- 一共是四次握手 第一次握手,客户端传第一个随机数C1给服务器,TSL版本和加密算法。
第二次握手,服务器传第二个随机数S2给客户端,TSL版本和加密算法。并且还把自己的数字证书【内含公钥、服务器信息和CA加密的哈希值】。
在第二次和第三次握手期间,需要进行证书校验。
第三次握手,验证通过之后客户端生成一个随机数PreMaseter,并用服务器端的公钥进行加密发送给服务器端。
这时候客户端和服务器都有3个共同的随机数。尤其是最后一个PreMaster是第三方不可能捕获后破解的。服务器和客户端有了这三个随机数(C1、S1、PreMaster),接着就用双方协商的加密算法(第一次和第二次握手时),各自生成本次通信的「会话秘钥」。
第四次握手:不再传随机数。而是通知客户端以后都用会话秘钥加密了哦。
(1)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。
(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用来供客户端校验。 - 握手期间信息泄露是有可能的,但是泄露的信息无关紧要。第一第二次泄露的是未加密的信息;第三次泄露的是加密后的信息,黑客拿到这三个数据都没用。因为第三次数据只有服务器的私钥能解。第四次数据已经用了会话秘钥加密。
- 摘要算法(哈希函数)在这里的作用主要是涉及CA证书校验那一块用的。哈希函数【是一个固定的算法】的作用:根据内容计算出哈希值,但不可能根据哈希值反推出内容。CA怎么用?CA把服务器给的数字信息(主要是组织名称,用途,公钥等)通过摘要算法计算出一个哈希值,然后把这哈希值添加到数字信息后面。这个步骤就是摘要算法的体现,其实就是把一长串内容变成一个更小的哈希值。
- 数字签名,得到了上面的哈希值,作用不大。CA还需要用自己的密钥给这个哈希值加密。这样这个哈希值就变成了数字签名。私钥加密,公钥解密用来确认消息的身份,这就是常说的数字签名。公钥加密,私钥解密,是用来保证传输安全。跟那个是不同的用途。总之,CA用自己的密钥给它哈希值加密。当有其他人用公钥解密的时候,就可以还原出数字证书原本的哈希值了。
- 数字证书,一个证书,在这里一般是包含了【服务器的数字信息(主要是组织名称,用途,公钥等)和CA数字签名后的哈希值】。
- 那怎么知道信息有没有被篡改呢?这里分两种情况,一种是普通的消息被篡改,另一种是数字证书被篡改。第一种情况,如果是普通消息被篡改,那导致的结果就是解密之后数据肯定是不正常的,因此可以忽略。另一种数字证书被篡改就比较值得讨论了,因为如果第三方在SSL握手第二个步骤篡改了数字证书,把数字证书中【服务器的数字信息(明文的)】修改了,那么客户端是怎么知道的呢?这就要用到前面很重要的一个东西了:那个哈希值,还是被CA的私钥加密过的。客户端拿到了数字证书之后,把数字证书里面的数字信息做一次摘要算法(哈希函数)得出一个哈希值,然后再用CA的公钥解密数字证书里的哈希值,对比二者。如果一致,说明证书是合格的。
- 怎么知道它给我的数字证书是不是我想要的服务器的,这种情况适用于在SSL第二次握手,第三方把自己在CA注册的证书给客户端,从客户端的角度看,其实并不知道网络中存在中间人服务器这个角色。那么中间人就可以解开浏览器发起的
HTTPS 请求里的数据,也可以解开服务端响应给浏览器的 HTTPS 响应数据。相当于,中间人能够 “偷看” 浏览器与服务端之间的
HTTPS 请求和响应的数据。 但是要发生这种场景是有前提的,前提是用户点击接受了中间人服务器的证书。 中间人服务器与客户端在 TLS
握手过程中,实际上发送了自己伪造的证书给浏览器,而这个伪造的证书是能被浏览器( 客户端)识别出是非法的,于是就会提醒用户该证书存在问题。
那浏览器是怎么鉴别出它非法的呢?其实有很多方法,比如说:判断证书合法性,包括证书是否由受信任的证书颁发机 构(CA)签发,是否过期,是否与请求的域名匹配等。