HTTPS建立连接过程
HTTPS建立连接过程
HTTPS连接建立的过程主要是在HTTP的基础上增加了SSL/TLS协议的握手过程,确保数据传输的安全性。
SSL/TLS协议基本流程:
- 客户端向服务器索要并验证服务器的公钥。
- 双方协商生产
会话秘钥。 - 双方采用
会话秘钥进行加密通信。
前两部分是SSL/TLS握手过程,涉及四次通信,使用不同的密钥交换算法,TLS握手流程也会不一样,常用的密钥交换算法有两种:RSA算法和ECDHE算法。
一、基于RSA算法的TLS握手流程

- ClientHello
首先,客户端向服务端发起加密通信请求,也就是ClientHello请求。
这一步客户端发送的主要信息为:
- 客户端支持的TLS协议版本
- 客户端生产的随机数(
Client Random),后面用于生成会话秘钥。 - 客户端支持的加密套件列表。
- ServerHello
服务器收到客户端的加密通信请求后,向客户端发出响应,也就是SeverHello。
服务器回应的内容有:
- 确认TLS协议版本,如果浏览器不支持,则关闭加密通信。
- 服务器生产的随机数(
Server Random),后面用于生成会话秘钥。 - 确认的加密套件列表,如RSA加密算法。
- 服务器的数字证书。
- 客户端回应
客户端收到服务端的回应后,首先通过浏览器或者操作系统中的CA公钥,确认服务器的数字证书的真实性。
如果证书没问题,客户端会从数字证书中取出服务器的公钥,然后使用它加密报文,向服务器发送如下信息:
- 一个随机数(
Pre-Master Key),该随机数会被服务器公钥加密。 - 加密通信算法改变通知,表示随后的信息都将用
会话密钥加密通信。 - 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时把之前的所有内容的发生的数据做个摘要用来供服务端校验。
- 服务器最后回应
服务器收到客户端的回应后,首先使用自己的私钥解密出客户端发送的随机数(Pre-Master Key),然后通过协商的加密算法,计算出本次通信的会话密钥。
然后向客户端发送最后的通知:
- 加密通信算法改变,表示随后的信息都将使用
会话秘钥加密通信。 - 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时把之前的所有内容的发生的数据做个摘要用来供客户端校验。
至此,整个TLS握手阶段结束。
二、数字证书签发和验证流程

CA签发证书过程,如上图左边部分:
- 首先CA会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行Hash计算,得到一个Hash值。
- 然后CA使用自己的私钥对这个Hash值进行加密,得到
Certificate Signature,也就是CA对证书做了签名。 - 最后将
Certificate Signature添加在文件证书上,形成数字证书。
客户端校验服务端的数字证书的过程,如上图右边部分:
- 首先客户端会使用同样的Hash算法获取该证书的Hash值H1。
- 通常浏览器和操作系统中集成了CA的公钥信息,浏览器收到证书后可以使用CA公钥解密
Certificate Signature,得到Hash值H2。 - 最后客户端比较H1和H2,如果两者相同,说明证书是可信的;如果不同,说明证书被篡改过或者不可信。
多层级证书验证流程:

三、基于ECDHE算法的TLS握手流程
RSA和ECDHE握手过程的区别:
- RSA密钥协商算法不支持前向保密,ECDHE密钥协商算法支持前向保密。
- 使用了RSA密钥协商算法,TLS完成四次握手后,才能进行应用数据传输,而对于ECDHE算法,客户端可以不用等服务端的最后一次TLS握手,就可以提前发出加密的HTTP数据,节省了一个消息的往返时间。
- 使用ECDHE,在TLS第2次握手中,会出现服务器端发出的
Server Key Exchange消息,而RSA握手过程没有该消息。
注:
- 前向保密:即使服务器的私钥泄露了,攻击者也无法解密之前的通信内容。
Server Key Exchange消息- 选择椭圆曲线
- 生成随机数作为服务端椭圆曲线的私钥,保存到本地
- 根据基点G和私钥计算出服务端的椭圆曲线公钥,这个会公开给客户端