转载请以链接形式标明出处: 本文出自:103style的博客
首先是 TCP 的三次握手,然后就到 TLS的通信。
Source | Destination | Protocol | Info |
|---|---|---|---|
Client | Server | TCP | [SYN] Seq=0 |
Server | Client | TCP | [SYN, ACK] Seq=0 Ack=1 |
Client | Server | TCP | [ACK] Seq=1 Ack=1 |
Client | Server | TLSv1.2 | Client Hello |
Server | Client | TLSv1.2 | Server Hello Certificate Server Key Exchange Server Hello Done |
Client | Server | TLSv1.2 | Client Key Exchange Change Cipher Spec Encrypted Handshake Message |
Server | Client | TLSv1.2 | New Session Ticket Change Cipher Spec Encrypted Handshake Message |
Client | Server | TLSv1.2 | Application Data |
Server | Client | TLSv1.2 | Application Data |
客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩展字段等信息,相关信息如下:
TSL协议 版本 version,从低到高依次 SSLv2 < SSLv3 < TLSv1 < TLSv1.1 < TLSv1.2,当前基本不再使用低于 TLSv1 的版本。Random, 用于后续的密钥的生成。Cipher Suites 列表,每个加密套件对应前面TLS原理中的四个功能的组合:认证算法(身份验证)、密钥交换算法KeyExchange(密钥协商)、对称加密算法Enc(信息加密)和 信息摘要Mac(完整性校验)。Compression Methods 列表,用于后续的信息压缩传输。Extension,支持协议与算法相关参数以及其它辅助信息等,常见的SNI就属于扩展字段。
Version(TLS 1.2),选择的加密套件 Cipher Suite(TLS_ECDHE_RAS_WITH_AES_128_GCM_SHA256),选择的压缩算法 Compression Method(null)、随机数 Random 等,其中随机数用于后续的密钥协商。


Server Hello中选择的 ECDHE 密钥交换算法 比 RSA 密钥交换算法多的一个步骤。

Server Hello 信息发送结束

客户端验证证书的合法性,如果验证通过才会进行后续的通信,否则根据错误情况做出不同提示和操作,合法性验证包括如下:
trusted catificate path(上面Server 端配置的证书链)
Pre-master,并用证书公钥加密,发送给服务器。
此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数 Random_C 和Random_S 与自己计算产生的 Pre-master,计算得到协商密钥:enc_key=Fuc(random_C,random_S,Pre-Master)。
为了加快建立握手的速度,减少协议带来的性能降低和资源消耗,TLS协议有两类会话缓存机制:会话标识Session ID 与 会话记录Session ticket。
Nginx 中 1M 内存约可以保存 4000个 Session ID 机器相关信息,占用服务器资源较多。
Client Hello 中 Session ID 中携带记录的信息,发送给服务器。Change Cipher Spec 与 Encrypted Handshake Message 信息,两个信息作用类似,Encrypted Handshake Message 是到当前的通信参数与 master_secret 的 Hash值。Change Cipher Spec 与Encrypted Handshake Message 信息。New Session Ticket 数据中携带加密的 Session ticket 信息,客户端保存。Client Hello 中扩展字段 Session Ticket 中携带加密信息,一起发送给服务器。Session Ticket 数据,如果解密失败,则按照正常的握手过程进行;Change Cipher Spec 与 Encrypted Handshake Message 信息,两个信息作用与 Session ID中类似。Change Cipher Spec
与Encrypted Handshake Message 信息。二者对比,主要是保存协议信息的位置与方式不同,类似于 http 的 sessin 与 cookie。
二者都存在的情况下,(nginx实现)优先使用 Session Ticket。
服务器用私钥解密加密的 Pre-master 数据,基于之前交换的两个明文随机数 Random_C和 Random_S,计算得到协商密钥:enc_key=Fuc(random_C,random_S,Pre-Master)。
计算之前所有接收信息的hash值,然后解密客户端发送的 Encrypted Handshake Message,验证数据和密钥的正确性。
Change Cipher Spec 以告知客户端后续的通信都采用协商的密钥与算法进行通信。
Session Secret 与算法加密并发送到客户端。
客户端计算所有接收信息的 Hash 值,并采用协商密钥解密 Encrypted Handshake Message,验证服务器发送的数据和密钥,验证通过则握手完成。
开始使用协商密钥与算法进行加密通信。注意:
Server Hello 过程要求发送 Client Certificate Request 信息,客户端在 Client Key Exchange 过程中先发送 Client Certificate 与 Certificate Verify Message 信息,证书的验证方式基本相同, Certificate Verify Message 是采用 Client 的私钥加密的一段基于已经协商的通信信息得到数据,服务器可以采用对应的公钥解密并验证。Sever Key Exchange 的作用是 Server Certificate 没有携带足够的信息时,发送给客户端以计算 pre-master,如基于 DH 的证书,公钥不被证书中包含,需要单独发送。Change Cipher Spec 实际可用于通知对端改变当前使用的加密通信方式。Alter message 用于指明在握手或通信过程中的状态改变或错误信息,一般告警信息触发条件是连接关闭,收到不合法的信息,信息解密失败,用户取消操作等,收到告警信息之后,通信会被断开或者由接收方决定是否断开连接。重建连接(renegotiation) 即放弃正在使用的 TLS 连接,重新进行 身份认证 和 密钥协商 的过程,特点是 不需要断开当前的数据传输 就可以重新 身份认证、更新密钥或算法,因此服务器端存储和缓存的信息都可以保持。客户端和服务器都能够发起重建连接的过程,当前 windows 2000 & XP 与 SSL 2.0不支持。
Hello Request 信息。Hello Request 信息之后发送 Client Hello 信息,开始重新建立连接。
Client Hello 信息。Client Hello 信息之后无法立即识别出该信息非应用数据,因此会提交给下一步处理,处理完之后会返回通知该信息为要求重建连接。Server Hello 信息至客户端。上节提到了两个明文传输的随机数 Random_C 和 Random_S 与通过加密在服务器和客户端之间交换的 Pre-master,三个参数作为密钥协商的基础。本节讨论说明密钥协商的基本计算过程以及通信过程中的密钥使用。
Random Client 和 Random Server, Pre-master, Master secret, key material, 计算密钥时,服务器和客户端都具有这些基本信息,交换方式在上节中有说明,计算流程如下:

RSA 或 Diffie-Hellman 等加密算法生成 Pre-master。Pre-master 结合 Random_C 和 Random_S 两个随机数通过 PseudoRandomFunction(PRF)计算得到 Master secret。Master secret 结合 Random_C 和 Random_S两个随机数通过迭代计算得到 Key material。以下为一些重要的记录,可以解决部分爱深入研究朋友的疑惑:
对于 RSA 密钥交换算法来说,pre-master-key 本身就是一个随机数,再加上 hello 消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。 pre master 的存在在于 SSL 协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么 pre master secret 就有可能被猜出来,那么仅适用 pre master secret 作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上 pre master secret 三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。
如果觉得不错的话,请帮忙点个赞呗。 如果看到有描述错误的地方,请指出来,感谢。
以上