HTTPS其实就是在HTTP的基础上加入了SSL/TLS协议,从它的名字上也看的出来,所以理解了SSL/TLS,也就理解了HTTPS的核心
SSL/TLS协议
SSL/TLS(Secure Socket Layer,安全套接字层)位于应用层和TCP/IP层之间,SSL是最开始的名称,后来一个组织收购了该协议
SSL/TLS是一套复杂的保证通信安全的协议。用Http协议通信的双方只修要建立TCP链接后就可以直接通信,而应用了SSL/TLS协议的通信双方还需要先建立SSL链接,再进行通信,如下所示
TCL链接-->SSL链接-->通信
SSL/TLS的大致工作流程是这样的:
客户端向服务端索要公钥并验证 双方协商生成回话秘钥(session Id) 通过会话密钥进行通信
其中前2个步骤称为握手阶段(handsshake),是整个https通信过程中用到非对称加密的阶段,后续的通信都是用会话密钥进行对称加密来完成的。
因为非对称加密使用了复杂的数学原理,如果每次通信都用非对称加密来加密通信内容的话,会严重影响网络通信的性能。并且SSL有一套复杂的设计来保证生成的会话密钥只有建立了SSL链接的通信双方才知道,所以后续通信用会话密钥进行对称加密通信其实也是安全的
握手阶段(handsshake)的详细过程
握手阶段一共有4次通信,且都是明文的
1.客户端向服务器发起加密通信的请求,这次请求称为ClientHello,发送的内容包括
一个随机数x,用来后续生产会话密钥 客户端支持的加密算法 客户端支持的SSL协议版本 支持的压缩方式
2.服务端收到请求后,响应客户端请求,这次请求称为ServerHello,返回如下数据
确认支持的SSL协议版本 确认加密算法 服务端公钥,为了数据安全,会放到证书中 一个随机数y,用来后续生产会话密钥
3.客户端收到服务器响应后,首先验证证书的有效性(即是否认证机构颁发,是否在有效期内),验证通过后,会从证书中取出公钥,并向服务端发送如下数据
一个随机数Z,用来后续生产会话密钥,注意这个随机数会用公钥加密 一个通知,告诉服务端,后续通信都用商定的加密方式和会话密钥进行 一个通知,告诉服务端,客户端握手结束
这个过程完成后,客户端就拥有了三个随机数,然后就用这三个数配合非对称加密算法生成一个 会话密钥
4.服务端收到最后一个随机数后,用私钥解密后就拥有了跟客户端一样的三个随机数,然后生成跟客户端相同的会话密钥,并做最后的回应
一个通知,告诉客户端,后续通信都用商定的加密方式和会话密钥进行 一个通知,告诉客户端,服务端端握手结束
上述4次通信完成后,客户端和服务端各自拥有了一个相同的会话密钥,且不再需要传输告知对象,所以后续的通信就可以用这个会话密钥进行对称加密来进行了。
我画了一张图,可以加深理解