咱们知道,HTTP 协议都是明文传输内容,在早期只展现静态内容时没有问题。伴随着互联网的快速发展,人们对于网络传输安全性的要求也愈来愈高,HTTPS 协议所以出现。如上图所示,在 HTTPS 加密中真正起做用的实际上是 SSL/TLS 协议。SSL/TLS 协议做用在 HTTP 协议之下,对于上层应用来讲,原来的发送接收数据流程不变,这就很好地兼容了老的 HTTP 协议,这也是软件开发中分层实现的体现。html
SSL/TLS 握手是为了安全地协商出一份对称加密的秘钥,这个过程颇有意思,下面咱们一块儿来了解一下。算法
如下内容须要你对加解密、数字签名和数字证书的概念有必定了解,这里有一篇文章能够帮你快速了解这几个概念。segmentfault
上图大体描述了 SSL/TLS 的握手过程,但缺乏了一些信息不利于理解,我会在后面的讲解里再列出来。安全
握手第一步是客户端向服务端发送 Client Hello 消息,这个消息里包含了一个客户端生成的随机数 Random1、客户端支持的加密套件(Support Ciphers)和 SSL Version 等信息。经过 Wireshark 抓包,咱们能够看到以下信息:服务器
Wireshark 抓包的用法能够参考这篇文章网络
第二步是服务端向客户端发送 Server Hello 消息,这个消息会从 Client Hello 传过来的 Support Ciphers 里肯定一份加密套件,这个套件决定了后续加密和生成摘要时具体使用哪些算法,另外还会生成一份随机数 Random2。注意,至此客户端和服务端都拥有了两个随机数(Random1+ Random2),这两个随机数会在后续生成对称秘钥时用到。app
这一步是服务端将本身的证书下发给客户端,让客户端验证本身的身份,客户端验证经过后取出证书中的公钥。dom
若是是DH算法,这里发送服务器使用的DH参数。RSA算法不须要这一步。post
Certificate Request 是服务端要求客户端上报证书,这一步是可选的,对于安全性要求高的场景会用到。优化
Server Hello Done 通知客户端 Server Hello 过程结束。
客户端收到服务端传来的证书后,先从 CA 验证该证书的合法性,验证经过后取出证书中的服务端公钥,再生成一个随机数 Random3,再用服务端公钥非对称加密 Random3 生成 PreMaster Key。
上面客户端根据服务器传来的公钥生成了 PreMaster Key,Client Key Exchange 就是将这个 key 传给服务端,服务端再用本身的私钥解出这个 PreMaster Key 获得客户端生成的 Random3。至此,客户端和服务端都拥有 Random1 + Random2 + Random3,两边再根据一样的算法就能够生成一份秘钥,握手结束后的应用层数据都是使用这个秘钥进行对称加密。为何要使用三个随机数呢?这是由于 SSL/TLS 握手过程的数据都是明文传输的,而且多个随机数种子来生成秘钥不容易被暴力破解出来。客户端将 PreMaster Key 传给服务端的过程以下图所示:
这一步是客户端通知服务端后面再发送的消息都会使用前面协商出来的秘钥加密了,是一条事件消息。
这一步对应的是 Client Finish 消息,客户端将前面的握手消息生成摘要再用协商好的秘钥加密,这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密,能解出来讲明前面协商出来的秘钥是一致的。
这一步是服务端通知客户端后面再发送的消息都会使用加密,也是一条事件消息。
这一步对应的是 Server Finish 消息,服务端也会将握手过程的消息生成摘要再用秘钥加密,这是服务端发出的第一条加密消息。客户端接收后会用秘钥解密,能解出来讲明协商的秘钥是一致的。
到这里,双方已安全地协商出了同一份秘钥,全部的应用层数据都会用这个秘钥加密后再经过 TCP 进行可靠传输。
前面提到 Certificate Request 是可选的,下面这张图展现了双向验证的过程:
若是每次重连都要从新握手仍是比较耗时的,因此能够对握手过程进行优化。从下图里咱们看到 Client Hello 消息里还附带了上一次的 Session ID,服务端接收到这个 Session ID 后若是能复用就再也不进行后续的握手过程。
除了上述的 Session 复用,SSL/TLS 握手还有一些优化技术,例如 False Start、Session Ticket 等,这方面的介绍具体能够参考这篇文章。
前面咱们一块儿详细地了解了整个 SSL/TLS 的握手过程,这部分知识在平时的开发过程当中不多用到,但能让咱们更清楚地了解 HTTPS 的工做原理,而不只仅是只知道 HTTPS 会加密数据十分安全。同时这个过程也是各类加密技术的一个经典运用,也能帮助咱们加深加密相关技术的理解。最后,建议你们也用 Wireshark 实际抓包体验一下这个过程来加深印象,enjoy~
www.ruanyifeng.com/blog/2014/0…
最后作个推广,欢迎关注公众号 MrPeakTech,我从这里学到不少,推荐给你们,共同进步~