转载请以链接形式标明出处: 本文出自: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 密钥交换算法来说,pre-master-key 本身就是一个随机数,再加上 hello 消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。 pre master 的存在在于 SSL 协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么 pre master secret 就有可能被猜出来,那么仅适用 pre master secret 作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上 pre master secret 三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。
如果觉得不错的话,请帮忙点个赞呗。 如果看到有描述错误的地方,请指出来,感谢。
以上