TLS加密协议学习笔记
简述TLS握手过程:
客户端发起握手请求,发送数据包
ClientHello:数据包中携带其所支持的SSL/TLS版本、Cipher suite 加密算法组合等,可以让服务器选择,并提供了一个客户端随机数,用于以后生成会话密钥使用。
服务器收到请求后返回数据包
ServerHello:
数据包中携带服务器选择的协议版本、加密算法,以及服务器随机数、会话ID等内容。其中,服务器选择的协议版本应小于等于客户端 ClientHello 中的协议版本。服务器发送完 ServerHello 数据包后又将发送数据包
Certificate:
数据包中携带了服务器的证书等信息,可通过证书链认证该证书的真实性。根据选择的加密算法组合的不同,服务器证书中的公钥也可被用于加密后面握手过程中生成的 Premaster secret。接着服务器发送数据包
ServerKeyExchange,ServerHelloDone:
数据包中携带服务器这边的 EC Diffie-Hellman 算法相关参数,并且告知客户端,服务器的hello结束了客户端最后会发送数据包
Client Key Exchange, Change Cipher Spec:
数据包表示客户端已将密钥及密钥规范修改,此消息以后数据都将加密传输服务器发送发送数据包
ChangeCipherSpec:
表示此消息以后数据都将加密传输
图例:

SSL/TLS安全协议组成:
SSL/TLS安全协议在应用程序协议层和TCP/IP层之间分层,所以它可以支持多个应用层协议。
SSL/TLS协议可分为两层。第一层是握手协议层,它由三个子协议组成:握手协议、更改密码规范协议和警报协议。第二层是记录协议层。
握手协议层
握手协议(Handshake):
用于在客户端和服务器之间协商会话信息。会话信息包括会话ID、对等证书、要使用的密码规范、要使用的压缩算法以及用于生成密钥的共享密钥。
更改密码规范协议(Change Cipher Spec):
用于更改客户端和服务器之间用于加密的密钥材料。密钥材料是用于创建加密密钥的原始数据。Change Cipher Spec子协议由一条消息组成,该消息告诉SSL/TLS会话中的另一方,也就是已知的对等方,发送方希望更改为一组新的密钥。根据握手子协议交换的信息计算密钥。
警报协议(Alert):
用于向对等方指示状态变化或错误情况。有各种各样的警报通知对等方正常和错误情况。警报通常在连接关闭、接收到无效消息、消息无法解密或用户取消操作时发送。
记录协议层
记录层的协议接收并加密来自应用层的数据,并将其传送到传输层。记录协议获取数据,将其分割成适合加密算法的大小,选择性地压缩(或,对于接收到的数据,将其解压缩),应用MAC或HMAC(HMAC仅受TLS支持),然后使用握手协议期间协商的信息加密(或解密)数据。
TLS协商过程中各报文详解:
一、初始的客户端消息
**
Client Hello**:客户端通过向服务器发送Client Hello消息来启动会话。Client Hello消息包含:
版本号:客户端发送与其支持的最高版本对应的版本号。版本2用于SSL 2.0,版本3用于SSL 3.0,版本3.1用于TLS。尽管用于TLS的IETF RFC是TLS版本1.0,但该协议在版本字段中使用3.1来表示它是比SSL 3.0更高的级别。随机生成的数据:ClientRandom[32],随机值,是一个4字节的数字,由客户端的日期和时间加上一个28字节随机生成的数字组成,最终将与服务器随机值一起使用,以生成一个主密钥,从中导出加密密钥。会话标识(如果有):包含sessionID是为了使客户端能够恢复上一个会话。恢复上一个会话可能很有用,因为创建新会话需要处理器密集型公钥操作,可以通过使用已建立的会话密钥恢复现有会话来避免这些操作。由sessionID标识的先前会话信息存储在相应的客户端和服务器会话缓存中。密码套件:客户端上可用的密码套件列表。密码套件的一个示例是TLS_RSA_WITH_DES_CBC_SHA,其中TLS是协议版本,RSA是用于密钥交换的算法,DES_CBC是加密算法(在CBC模式下使用56位密钥),SHA是哈希函数。压缩算法:请求的压缩算法。
二、服务端的响应消息
Server hello:服务器以Server Hello消息进行响应。Server Hello消息包括:
版本号:服务器发送双方支持的最高版本号。随机生成的数据:ServerRandom[32],随机值,是服务器日期和时间的4字节数字加上随机生成的28字节数字,最终将与客户端随机值一起使用,以生成一个主密钥,从中导出加密密钥。会话标识(如果有):这可以是三种选择之一。New session ID–客户端未指示要恢复的会话,因此生成了一个新ID。当客户端指示要恢复的会话,但服务器不能或不想恢复该会话时,也会生成一个新的会话ID。后一种情况也会产生一个新的会话ID。Resumed Session ID–该ID与Client Hello中指示的ID相同。客户端指示要恢复的会话ID,服务器愿意恢复该会话。Null–这是一个新会话,但服务器不愿意在以后恢复会话,因此不返回ID。
密码套件:服务器将选择客户端和服务器都支持的最强密码。如果双方都不支持密码套件,会话将以“握手失败”警报结束。压缩算法:指定要使用的压缩算法。Server Certificate:
服务器将其证书发送到客户端。服务器证书包含服务器的公钥。客户端将使用此密钥对服务器进行身份验证并加密premaster key。客户端还检查证书中服务器的名称,以验证它是否与用于连接的客户端的名称匹配。Server Key Exchange:
这是一个可选步骤,在该步骤中,服务器创建临时密钥并将其发送到客户端。客户端可以使用此密钥在稍后的过程中加密客户端密钥交换消息。仅当公钥算法未提供加密客户端密钥交换消息所需的密钥材料时,例如当服务器的证书不包含公钥时,才需要执行该步骤。Client Certificate Request:
这是一个可选步骤,其中服务器请求对客户端进行身份验证。此步骤可用于服务器必须在提供敏感信息之前确认客户端身份的网站(如银行网站)。服务器Server Hello Done:
此消息表示服务器已完成,正在等待客户端的响应。
三、客户端给服务器的响应
Client Certificate:
如果服务器发送了客户端证书请求,则客户端会将其证书发送到服务器以进行客户端身份验证。客户端的证书包含客户端的公钥。Client Key Exchange:
客户端在使用两个随机值计算premaster key后发送客户端密钥交换消息。premaster key在传输到服务器之前由服务器证书中的公钥加密。双方将在本地计算主密钥并从中派生会话密钥。
如果服务器可以解密此数据并完成协议,则客户端将确保服务器具有正确的私钥。这一步对于证明服务器的真实性至关重要。只有私钥与证书中的公钥匹配的服务器才能解密此数据并继续协议协商。
此消息还将包括协议版本。服务器将验证它是否与客户端hello消息中发送的原始值匹配。此措施可防止回滚攻击。回滚攻击通过操纵消息来工作,以使服务器和客户端使用不太安全的早期版本的协议。Certificate Verify:
仅当客户端以前发送了客户端证书消息时,才会发送此消息。客户端通过使用其私钥对到目前为止所有消息的哈希进行签名来进行身份验证。接收方使用签名者的公钥验证签名,从而确保签名是使用客户端的私钥签名的。Change Cipher Spec:
此消息通知服务器,客户端完成消息之后的所有消息将使用刚才协商的密钥和算法进行加密。Client Finished:
此消息是整个对话的散列,以提供客户端的进一步身份验证。此消息是记录层加密和散列的第一条消息。
四、服务器对客户端的最终响应。
Change Cipher Spec Message:此消息通知客户端服务器将开始使用刚刚协商的密钥加密消息。
Server Finished Message:
此消息是到目前为止使用会话密钥和MAC密钥的整个交换的散列。如果客户端能够成功解密此消息并验证包含的哈希,则可以确保SSL/TLS握手成功,并且客户端计算机上计算的密钥与服务器上计算的密钥匹配。
五、警报子协议
警报子协议是握手协议的一个组件,其中包括可从任何一方发送的事件驱动警报消息。在发出警报消息后,会话结束,或者收件人可以选择是否结束会话。警报在RFC 2246中的TLS规范中定义。






