SSL/TLS 握手过程详解

文章介绍了SSL/TLS协议在HTTPS加密中的作用,详细阐述了SSL/TLS握手过程,包括客户端与服务端的消息交互、随机数生成及对称秘钥协商等。还提及双向验证过程,以及握手过程的优化方法,如Session复用等,有助于了解HTTPS工作原理和加密技术。

 

转自:http://www.jianshu.com/p/7158568e4867

我们知道,HTTP 协议都是明文传输内容,在早期只展示静态内容时没有问题。伴随着互联网的快速发展,人们对于网络传输安全性的要求也越来越高,HTTPS 协议因此出现。如上图所示,在 HTTPS 加密中真正起作用的其实是 SSL/TLS 协议。SSL/TLS 协议作用在 HTTP 协议之下,对于上层应用来说,原来的发送接收数据流程不变,这就很好地兼容了老的 HTTP 协议,这也是软件开发中分层实现的体现。

SSL/TLS 握手是为了安全地协商出一份对称加密的秘钥,这个过程很有意思,下面我们一起来了解一下。

以下内容需要你对加解密、数字签名和数字证书的概念有一定了解,这里有一篇文章可以帮你快速了解这几个概念。

SSL/TLS 握手过程

上图大致描述了 SSL/TLS 的握手过程,但缺少了一些信息不利于理解,我会在后面的讲解里再列出来。

Client Hello

握手第一步是客户端向服务端发送 Client Hello 消息,这个消息里包含了一个客户端生成的随机数 Random1、客户端支持的加密套件(Support Ciphers)和 SSL Version 等信息。通过 Wireshark 抓包,我们可以看到如下信息:

Wireshark 抓包的用法可以参考这篇文章

Server Hello

第二步是服务端向客户端发送 Server Hello 消息,这个消息会从 Client Hello 传过来的 Support Ciphers 里确定一份加密套件,这个套件决定了后续加密和生成摘要时具体使用哪些算法,另外还会生成一份随机数 Random2。注意,至此客户端和服务端都拥有了两个随机数(Random1+ Random2),这两个随机数会在后续生成对称秘钥时用到。

Certificate

这一步是服务端将自己的证书下发给客户端,让客户端验证自己的身份,客户端验证通过后取出证书中的公钥。

Server Key Exchange

如果是DH算法,这里发送服务器使用的DH参数。RSA算法不需要这一步。

Certificate Request

Certificate Request 是服务端要求客户端上报证书,这一步是可选的,对于安全性要求高的场景会用到。

Server Hello Done

Server Hello Done 通知客户端 Server Hello 过程结束。

Certificate Verify

客户端收到服务端传来的证书后,先从 CA 验证该证书的合法性,验证通过后取出证书中的服务端公钥,再生成一个随机数 Random3,再用服务端公钥非对称加密 Random3生成 PreMaster Key。

Client Key Exchange

上面客户端根据服务器传来的公钥生成了 PreMaster Key,Client Key Exchange 就是将这个 key 传给服务端,服务端再用自己的私钥解出这个 PreMaster Key 得到客户端生成的 Random3。至此,客户端和服务端都拥有 Random1 + Random2 + Random3,两边再根据同样的算法就可以生成一份秘钥,握手结束后的应用层数据都是使用这个秘钥进行对称加密。为什么要使用三个随机数呢?这是因为 SSL/TLS 握手过程的数据都是明文传输的,并且多个随机数种子来生成秘钥不容易被暴力破解出来。客户端将 PreMaster Key 传给服务端的过程如下图所示:

Change Cipher Spec(Client)

这一步是客户端通知服务端后面再发送的消息都会使用前面协商出来的秘钥加密了,是一条事件消息。

Encrypted Handshake Message(Client)

这一步对应的是 Client Finish 消息,客户端将前面的握手消息生成摘要再用协商好的秘钥加密,这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密,能解出来说明前面协商出来的秘钥是一致的。

Change Cipher Spec(Server)

这一步是服务端通知客户端后面再发送的消息都会使用加密,也是一条事件消息。

Encrypted Handshake Message(Server)

这一步对应的是 Server Finish 消息,服务端也会将握手过程的消息生成摘要再用秘钥加密,这是服务端发出的第一条加密消息。客户端接收后会用秘钥解密,能解出来说明协商的秘钥是一致的。

Application Data

到这里,双方已安全地协商出了同一份秘钥,所有的应用层数据都会用这个秘钥加密后再通过 TCP 进行可靠传输。

双向验证

前面提到 Certificate Request 是可选的,下面这张图展示了双向验证的过程:

握手过程优化

如果每次重连都要重新握手还是比较耗时的,所以可以对握手过程进行优化。从下图里我们看到 Client Hello 消息里还附带了上一次的 Session ID,服务端接收到这个 Session ID 后如果能复用就不再进行后续的握手过程。

除了上述的 Session 复用,SSL/TLS 握手还有一些优化技术,例如 False Start、Session Ticket 等,这方面的介绍具体可以参考这篇文章

总结

前面我们一起详细地了解了整个 SSL/TLS 的握手过程,这部分知识在平时的开发过程中很少用到,但能让我们更清楚地了解 HTTPS 的工作原理,而不仅仅是只知道 HTTPS 会加密数据十分安全。同时这个过程也是各种加密技术的一个经典运用,也能帮助我们加深加密相关技术的理解。最后,建议大家也用 Wireshark 实际抓包体验一下这个过程来加深印象,enjoy~

参考资料

http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html

https://segmentfault.com/a/1190000002554673

https://imququ.com/post/optimize-tls-handshake.html

http://blog.youkuaiyun.com/fw0124/article/details/40983787

<think>好的,用户现在想详细了解SSL/TLS握手过程的步骤以及加密套件在其中的作用。之前我已经回答过类似的问题,但这次用户明确要求更详细的步骤和加密套件的具体应用阶段。我需要结合之前的回答和引用内容,整理出一个结构清晰的解释。 首先,用户提到参考了站内的三个引用,分别是关于握手过程详解、抓包分析和TLS/SSL握手的学习笔记。这些引用涵盖了握手的历史发展、步骤概览、密钥交换、身份验证等,还有实际抓包的建议。用户的上一次回答已经分阶段说明了加密套件的使用,现在需要更详细的步骤,并突出加密套件的作用。 我需要确定SSL/TLS握手的主要步骤,通常包括Client Hello、Server Hello、证书交换、密钥交换、生成会话密钥等。同时,要明确每个步骤中加密套件的哪个部分被使用,比如密钥交换算法在Server Key Exchange阶段,身份验证在证书验证阶段等。 用户可能对TLS 1.2和1.3的区别感兴趣,但问题中没有明确提到,所以可能需要简要提及,但重点还是放在通用步骤上。另外,用户之前的回答已经提到过前向保密,这里可能需要关联到密钥交换算法如ECDHE。 需要确保每个步骤都对应到加密套件的组件,比如TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256中的各个部分如何在不同阶段应用。同时,引用中的资料提到证书验证、密钥交换、对称加密的应用阶段,这些都需要整合到回答中。 还要注意用户希望详细步骤,所以可能需要分点详细描述每个阶段,比如将握手过程分为6个步骤,每个步骤说明做了什么,加密套件的哪部分参与其中。例如,Client Hello发送支持的加密套件列表,Server Hello选择具体的套件,之后证书验证使用身份验证算法,密钥交换使用密钥交换算法等。 另外,用户可能对实际应用中的例子或抓包分析感兴趣,但问题主要集中在理论步骤,所以可以简要提到抓包工具如Wireshark,但不需要深入。最后,生成的相关问题需要考虑用户可能进一步想了解的内容,比如密钥交换算法选择的影响,如何验证证书,或者不同TLS版本的区别。 需要确保回答结构清晰,分步骤说明,并在每个步骤中明确加密套件的作用。同时,引用之前的引用资料,比如在证书验证阶段引用[^1]和[^3],在密钥交换阶段引用[^4]和[^3]等。保持语言简洁,技术细节准确,避免错误。</think>以下是SSL/TLS握手过程的**详细步骤**及**加密套件在各阶段的核心作用**,结合技术实现和协议规范进行分层解析: --- ### 一、SSL/TLS握手全流程详解(以TLS 1.2为例) #### 1. **Client Hello** - **功能**:客户端发起握手,声明能力 - 发送支持的TLS版本(如TLS 1.2) - 生成客户端随机数(Client Random) - 列出**支持的加密套件列表**(如`TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256`)[^1] - 提供支持的压缩方法(可选) #### 2. **Server Hello** - **功能**:服务器确认协议参数 - 选择双方兼容的TLS版本 - 生成服务端随机数(Server Random) - 从客户端列表中选择**一个加密套件**(如上述ECDHE-RSA套件) - 确定是否启用会话恢复(Session ID)[^1] #### 3. **Certificate Exchange** - **功能**:身份验证 - 服务器发送数字证书链(包含公钥),证书签名算法由加密套件的**身份验证算法**决定(如RSA)[^3] - 客户端验证证书合法性(CA链、有效期、吊销状态) #### 4. **Server Key Exchange** - **功能**:传递密钥交换参数 - 当使用**临时密钥交换算法**(如ECDHE)时,服务器发送: - 椭圆曲线参数(如命名曲线secp256r1) - 服务端临时公钥(Server Params) - 使用证书私钥对参数签名(RSA签名)[^1] #### 5. **Client Key Exchange** - **功能**:完成密钥协商 - 客户端根据服务器参数生成临时公钥(Client Params) - 若使用RSA密钥交换,客户端直接生成预主密钥(Pre-Master Secret)并用服务器公钥加密传输[^3] #### 6. **Finished** - **功能**:验证握手完整性 - 双方根据预主密钥、Client/Server Random生成主密钥(Master Secret) - 用主密钥派生出**对称加密密钥**(如AES-128)和**MAC密钥**(如HMAC-SHA256) - 交换加密后的Finished消息验证握手数据完整性 --- ### 二、加密套件在各阶段的具体应用 以`TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256`为例: | 组件 | 作用阶段 | 技术实现 | |----------------------|---------------------------|--------------------------------------------------------------------------| | **ECDHE**(密钥交换) | Server/Client Key Exchange | 通过临时椭圆曲线参数生成预主密钥,实现前向保密 | | **RSA**(身份验证) | Certificate Exchange | 验证服务器证书签名,确保公钥真实性[^3] | | **AES_128_GCM** | Application Data | 加密HTTP数据,GCM模式同时提供机密性和完整性校验 | | **SHA256** | Finished & MAC | 生成主密钥时用于PRF函数,并作为HMAC算法验证数据完整性[^1] | --- ### 三、关键协议消息流程图 ```plaintext Client Server |-----Client Hello---------------------->| |<----Server Hello-----------------------| |<----Certificate------------------------| # RSA身份验证 |<----Server Key Exchange----------------| # ECDHE参数传递 |-----Client Key Exchange--------------->| # 客户端临时公钥 |-----Change Cipher Spec---------------->| # 切换加密模式 |-----Finished-------------------------->| # 验证握手数据 |<----Change Cipher Spec-----------------| |<----Finished---------------------------| |-----Application Data------------------>| # AES-GCM加密数据 ``` --- ### 四、TLS 1.3的优化改进 1. **加密套件简化**:删除不安全算法(如RSA密钥交换),强制使用前向保密(仅支持ECDHE)[^1] 2. **1-RTT握手**:通过预共享密钥(PSK)或0-RTT模式减少交互次数 3. **密钥分离**:明确区分握手密钥与应用数据密钥,增强安全性 --- ### 五、抓包验证建议 通过Wireshark抓包可观察到: - `Client Hello`中的`Cipher Suites`字段(如截图) - `Server Hello`中选定的加密套件 - `Server Key Exchange`中的ECDHE参数(十六进制值)[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值