PHP架构程序猿阵线联盟-汇总各类技术干货PHP经验分享

HTTPS(TLS/SSL)握手过程

2017-12-06  本文已影响19人  E狼

本文大部分内容摘自:http://www.wosign.com/faq/faq2016-0309-04.htm 尊重知识产权,转载注明

1、握手与密钥协商过程

基于RSA握手和密钥交换的客户端验证服务器为示例详解TLS/SSL握手过程


图片.png

再看一张手绘时序图

image

1. client_hello

客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息,相关信息如下:

2. server_hello+server_certificate+sever_hello_done

3. 证书校验

客户端验证证书的合法性,如果验证通过才会进行后续通信,否则根据错误情况不同做出提示和操作,合法性验证包括如下:

4. client_key_exchange+change_cipher_spec+encrypted_handshake_message

5.change_cipher_spec+encrypted_handshake_message

6 .握手结束

客户端计算所有接收信息的 hash 值,并采用协商密钥解密 encrypted_handshake_message,验证服务器发送的数据和密钥,验证通过则握手完成;

7.加密通信

开始使用协商密钥与算法进行加密通信。

注意:

  1. 服务器也可以要求验证客户端,即双向认证,可以在过程2要发送 client_certificate_request 信息,客户端在过程4中先发送 client_certificate与certificate_verify_message 信息,证书的验证方式基本相同,certificate_verify_message 是采用client的私钥加密的一段基于已经协商的通信信息得到数据,服务器可以采用对应的公钥解密并验证;
  2. 根据使用的密钥交换算法的不同,如 ECC 等,协商细节略有不同,总体相似;
  3. sever key exchange 的作用是 server certificate 没有携带足够的信息时,发送给客户端以计算 pre-master,如基于 DH 的证书,公钥不被证书中包含,需要单独发送;
  4. change cipher spec 实际可用于通知对端改版当前使用的加密通信方式,当前没有深入解析;
  5. alter message 用于指明在握手或通信过程中的状态改变或错误信息,一般告警信息触发条件是连接关闭,收到不合法的信息,信息解密失败,用户取消操作等,收到告警信息之后,通信会被断开或者由接收方决定是否断开连接。

2、会话缓存握手过程

为了加快建立握手的速度,减少协议带来的性能降低和资源消耗(具体分析在后文),TLS 协议有两类会话缓存机制:会话标识 session ID 与会话记录 session ticket。

session ID 由服务器端支持,协议中的标准字段,因此基本所有服务器都支持,服务器端保存会话ID以及协商的通信信息,Nginx 中1M 内存约可以保存4000个 session ID 机器相关信息,占用服务器资源较多;

session ticket 需要服务器和客户端都支持,属于一个扩展字段,支持范围约60%(无可靠统计与来源),将协商的通信信息加密之后发送给客户端保存,密钥只有服务器知道,占用服务器资源很少。
二者对比,主要是保存协商信息的位置与方式不同,类似与 http 中的 session 与 cookie。
二者都存在的情况下,(nginx 实现)优先使用 session_ticket。
握手过程如下图:


image
注意:

虽然握手过程有1.5个来回,但是最后客户端向服务器发送的第一条应用数据不需要等待服务器返回的信息,因此握手延时是1*RTT。

(1).会话标识 session ID
(2).会话记录 session ticket

3、重建连接

重建连接 renegotiation 即放弃正在使用的 TLS 连接,从新进行身份认证和密钥协商的过程,特点是不需要断开当前的数据传输就可以重新身份认证、更新密钥或算法,因此服务器端存储和缓存的信息都可以保持。客户端和服务器都能够发起重建连接的过程,当前 windows 2000 & XP 与 SSL 2.0不支持。

服务器重建连接
image

服务器端重建连接一般情况是客户端访问受保护的数据时发生。基本过程如下:

客户端重建连接
图片.png

客户端重建连接一般是为了更新通信密钥。

上一篇 下一篇

猜你喜欢

热点阅读