前端与http和https | 青训营笔记

35 阅读3分钟

这是我参与第五届青训营伴学笔记创作活动的第三天,

http相关

三次握手

第一次客户端向服务端发送初始序列号,第二次服务端向客户端发送表示接受到了然后回复我成功接受到了,第三次客户端向服务端发送表示客户端对于服务端初始序号的确认。

为什么需要三次握手

防止重复连接,如果网络较差的情况下第一次连接较后到达,第三次握手能判断是否是历史遗留的连接,从而决定是否终止连接。

确定可靠的初始化序列号,如上两段所示。

四次挥手

第一次客户端发送关闭的请求,第二次服务端回复知道了,此时不再接收客户端的信息,但是此时还有信息未传输完成,等到信息传输完成后,发送第三次请求说明我也想关闭了,第四次时客户端收到释放请求后,发送确认应答。


https

https相对于http多了一个s,这个s代表的是SSLTLS,在tcp握手以后,还要进行TLS握手,才可以开始通信。

TLS的握手过程

一共四个回合

1.客户端发出请求(Client Hello)

  • 支持的协议版本,比如TLS 1.0版
  • 一个客户端生成的随机数,稍后用于生成"会话密钥"
  • 支持的密码套件(支持的加密方法)

2.服务器回应(Server Hello + Server Certificate+ ServerKeyExchange+ServerHelloDone)

  • 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。

  • 一个服务器生成的随机数,稍后用于生成"会话密钥"

  • 确认使用的加密方法,比如RSA公钥加密(确认密码套件)

  • 服务器证书(CA 证书,在Certificate阶段发送,证书中包含服务器的公钥)

  • Server Hello Done 服务器发送完上述信息后,会立刻发送该信息,然后等到客户端的回应

3.客户端回应(ClientKeyExchange+ ChangeCiperSpec + Finished)

客户端收到服务器回应以后,开始走证书链逐级验证,确认证书的真实性,如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。如果证书真实有效,从证书中拿出服务器公钥,向服务器发送下面三项信息:

  • 一个用服务器公钥加密随机数(pre-master key),防止被窃听
  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送(Change Cipher Spec)
  • 客户端握手结束通知(Finished),表示客户端的握手阶段已经结束。这一项是把之前所有发送的数据做个摘要(hash值),再加密一下,供服务器校验

上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。

4.服务器的最后回应

服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。

然后,向客户端最后发送下面信息:

  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送(Change Cipher Spec)
  • 服务端握手结束通知(Finished),表示服务端的握手阶段已经结束。这一项是把之前所有发送的数据做个摘要(hash值),再加密一下,供客户端校验

TLS握手结束后,双方开始使用对称会话密钥进行加密通信。