一、SSL双向握手的每一阶段都做了什么(以RSA算法为例)
(一)第一阶段:Client Hello数据包(客户端->服务端)
SSL双向握手整体流程如下图:
Client hello数据包是客户端向服务端发送的初始消息,是SSL双向握手的开始,用来请求建立安全通信信道。该数据包主要包含如下信息:
SSL/TLS 版本:指示客户端支持的最高和最低协议版本。这两个版本号用于在服务器选择协议版本时提供一个范围。(不是把客户端支持的所有版本都列出来)
随机数:客户端生成一个随机数,占据32字节,由两部分组成(Unix 时间戳和随机字节),包含在 "Client Hello" 消息中。这个随机数在后续用于生成会话密钥、初始化向量生成、非对称密钥交换以及数据完整性保护。
加密算法列表:客户端列出了其支持的加密算法和压缩方法。服务器将从这个列表中选择合适的加密算法和压缩方法。
会话恢复(可选):如果客户端之前与同一服务器建立过 SSL/TLS 会话,并希望重用会话密钥以实现会话恢复(Session Resumption),则可以在 "Client Hello" 中包含会话标识(Session ID)。
(二)第二阶段:Server hello数据包(服务端->客户端)
"Server Hello"是服务器对客户端的"Client Hello"消息作出的响应。在"Server Hello"阶段,服务器选择一个加密套件(Cipher Suite)并协商会话参数,然后向客户端发送包含这些信息的消息。"Server Hello" 消息的主要内容包括:
协议版本号:服务器选择的 SSL/TLS 协议版本号,通常是客户端提供的版本范围内的一个值。
随机数:服务器生成的随机数,用于生成会话密钥、初始化向量生成、非对称密钥交换以及数据完整性保护。
加密套件:服务器从客户端提供的加密套件列表中选择一个支持的加密套件,用于后续的加密和解密操作。加密套件包括加密算法、密钥交换算法等。
压缩方法:服务器从客户端提供的压缩方法列表中选择一个支持的压缩方法,用于后续的数据传输。
会话 ID:如果客户端在 "Client Hello" 中提供了会话 ID,服务器可以选择重用之前的会话状态。在这种情况下,服务器会在 "Server Hello" 中包含相应的会话 ID。
(三)第三阶段:Certificate、Certificate Request、Server HelloDone数据包(服务端->客户端)
1.Certificate数据包
Server Certificate(服务器证书):服务器向客户端发送服务端的数字证书,证书中包含服务器的公钥。该证书由一个受信任的证书颁发机构(CA)签名,用于验证服务器的身份。
2.Certificate Request数据包
Certificate Request(客户端证书请求):服务器向客户端发送一个消息,请求客户端提供客户端的数字证书,以便服务器能够验证客户端的身份。通常分为两种使用情况:
双向认证:服务器需要验证客户端的身份,以确保客户端是合法的。
客户端证书认证:服务器希望获取客户端的证书,以便在后续通信中使用客户端的公钥进行加密。(客户端可以选择提供证书以进行身份验证,或者忽略 "Certificate Request" 阶段,继续后续的握手过程。)
"Certificate Request" 消息的内容通常包括:
证书类型列表:服务器列出所支持的证书类型,例如 RSA、DSA、ECDSA 等。
摘要算法列表:服务器列出所支持的摘要算法,用于数字签名验证。
可选的 CA 名单:服务器发送一个包含可接受的证书颁发机构(Certificate Authorities,简称CAs)列表的消息,客户端需要从中选择一个合适的数字证书来响应请求。
3.Server Hello Done数据包
"Server Hello Done" 数据包是服务器在发送完"Server Hello"消息后,向客户端发送的一个空消息,用于通知客户端服务器已完成"Server Hello"阶段,并且客户端可以继续握手的下一个步骤。
(四)Certificate、Client Key Exchange、Certificate Verify数据包(客户端->服务端)
1.Certificate数据包
Client Certificate(客户端证书):客户端向服务器发送客户端的数字证书,证书中包含客户端的公钥。该证书由一个受信任的证书颁发机构(CA)签名,用于验证客户端的身份。客户端Certificate数据包的作用有:
身份验证:客户端在 "Certificate" 数据包中包含自己的数字证书,以便服务端验证客户端的身份。数字证书由证书颁发机构(CA)签发,包含了客户端的公钥和其他身份信息。服务端可以使用该证书来确认客户端的合法性和真实性。
密钥交换:在某些加密算法中,客户端的数字证书也可以用于密钥交换。例如,在使用基于证书的身份验证的协议(如TLS-RSA和TLS-DHE-RSA)中,服务端的数字证书会包含一个公钥,服客户端可以使用这个公钥来交换临时密钥,用于后续通信的加密。
2.Client Key Exchange数据包
"Client Key Exchange" 数据包用于进行密钥交换。这个数据包包含了客户端生成的临时密钥,用于后续通信的加密和解密。"Client Key Exchange" 数据包的内容取决于所使用的密钥交换算法和加密套件。
在使用RSA密钥交换的情况下,"Client Key Exchange" 会生成第三个随机数(预主密钥),使用服务端公钥加密预主密钥,发送给服务端。这样,服务端接受到后,就可以使用自己的私钥解密并获取临时密钥。
3.Certificate Verify数据包
"Certificate Verify" 数据包用于客户端对给服务端发送的所有握手消息进行数字签名,以证明其拥有客户端的私钥。通过这个数字签名,客户端向服务器证明自己的身份和能力,同时确保握手过程的安全性。
"Certificate Verify" 数据包中包含以下内容:
Signature Algorithm(签名算法):指示用于生成数字签名的算法类型。
Signature(数字签名):这是客户端对握手过程中之前交换的所有数据进行签名的结果。签名是使用客户端的私钥生成的,以证明客户端对其证书的控制权。签名包括握手消息的摘要(通常是SHA-256或其他哈希算法的结果),并使用客户端的私钥进行加密。服务器将使用客户端的证书中的公钥来验证签名的有效性。
Hash Algorithm(哈希算法):指示用于生成消息摘要的哈希算法。
(五)第五阶段:Change Cipher Spec、Encrypted Handshake Message数据包(客户端->服务端)
1.Change Cipher Spec数据包
"Change Cipher Spec" 数据包用于通知接收方在此之后的通信将使用新的加密参数(主密钥)。它是一种非常简单的协议消息,本身不携带任何额外的数据,仅包含一个字节的数值,表示切换到加密状态。
具体来说,"Change Cipher Spec" 数据包的作用如下:
切换加密状态:在握手过程中,双方会协商加密参数,包括加密算法、密钥等。当握手阶段完成后,通过发送 "Change Cipher Spec" 数据包,发送方通知接收方开始使用协商好的加密参数进行数据加密和解密。
握手完成标志:在握手过程的最后,发送 "Change Cipher Spec" 数据包也可以作为握手完成的标志。一旦接收到这个消息,双方都知道握手已经成功完成,加密通信状态已经建立。
2.Encrypted Handshake Message数据包
“Encrypted Handshake Message”数据包:客户端将要发送给服务端的握手消息(在通信双方之间协商参数、进行身份验证、建立安全通道的一系列消息),使用主密钥进行加密,生成 "Encrypted Handshake Message" 数据包。
(六)第六阶段:Change Cipher Spec、Encrypted Handshake Message数据包(服务端->客户端)
1.Change Cipher Spec数据包
与客户端向服务端发送的"Change Cipher Spec" 数据包作用相同,告知客户端服务端已经生成了主密钥,接下来使用新的加密参数(主密钥)进行通信。
2.Encrypted Handshake Message数据包
“Encrypted Handshake Message”数据包:服务端使用主密钥加密的第一个数据,发送给客户端,客户端使用此消息来验证自身主密钥的正确性。
(七)第七阶段:加密通信
握手完成后,双方使用加密信道开始通信。
二、阐述RSA与ECDHE握手中的密钥产生区别
首先分别说明一下RSA和ECDHE的握手流程:
(一)RSA握手流程
1. 客户端Hello:客户端向服务器发送一个随机数,支持的加密套件列表,以及其他的握手信息。
2. 服务器Hello:服务器从客户端提供的加密套件列表中选择一个,并发送自己的证书、一个随机数,以及支持的加密算法和版本。
3. 服务器Key Exchange(可选):如果服务器的证书要求客户端提供一个预主密钥,服务器将发送 "Server Key Exchange" 消息,其中可能包含RSA的公钥(用于加密预主密钥)。
4. 证书请求(可选):如果服务器需要客户端提供证书以进行身份验证,服务器会发送 "Certificate Request" 消息。
5. 服务器Hello Done:服务器通知握手消息的结束,等待客户端响应。
6. 客户端证书和Key Exchange:如果服务器要求,客户端将发送其数字证书以进行身份验证。同时,客户端生成一个随机的Pre-Master Secret,并使用服务器的RSA公钥加密,然后发送给服务器。
7. 握手完成:双方交换 "Change Cipher Spec" 和 "Finished" 消息,表示握手成功完成,通信将切换到加密模式。
(二)ECDHE握手流程
1. 客户端Hello:客户端向服务器发送一个随机数,支持的加密套件列表,以及其他的握手信息。
2. 服务器Hello:服务器从客户端提供的加密套件列表中选择一个,并发送自己的证书、一个随机数,以及支持的加密算法和版本。
3. 服务器Key Exchange(Ephemeral公钥):服务器生成一个临时的椭圆曲线密钥对,将公钥发送给客户端。
4. 服务器Hello Done:服务器通知握手消息的结束,等待客户端响应。
5. 客户端Key Exchange(Ephemeral公钥):客户端也生成一个临时的椭圆曲线密钥对,将公钥发送给服务器。
6. 握手完成:双方交换 "Change Cipher Spec" 和 "Finished" 消息,表示握手成功完成,通信将切换到加密模式。
最后,以上是我个人对RSA握手流程的理解,如果有不对的地方敬请批评指正。
网络方面的知识推荐小林coding的图解网络,不论是学习还是面试准备都很有用!