TLS简介
TLS是一种安全协议,用于在两个通信应用程序之间提供保密性和数据完整性。
它是SSL协议的继任者,由IETF(互联网工程任务组)在RFC 5246中标准化。
TLS协议位于TCP/IP协议栈的传输层之上,它使用加密技术来确保数据的机密性(只有预期的接收者可以读取数据)和完整性(数据在传输过程中不会被篡改)。
TLS工作流程:
1. 握手开始(ClientHello)
- 客户端发起请求:客户端首先向服务器发送一个“ClientHello”消息,该消息包含客户端支持的TLS版本、加密套件列表(加密算法和密钥交换方法的组合)、压缩方法列表以及一个由客户端生成的随机数(Client Random)。这个随机数用于后续的密钥生成。
2. 服务器响应(ServerHello + ServerCertificate等)
- 服务器选择参数:服务器收到ClientHello消息后,会从中选择一个双方都支持的TLS版本、加密套件,并生成一个自己的随机数(Server Random)。
- 发送ServerHello:服务器向客户端发送“ServerHello”消息,包含选定的TLS版本、加密套件、服务器随机数等信息。
- 发送证书:服务器还会发送自己的数字证书(ServerCertificate),该证书包含服务器的公钥和由证书颁发机构(CA)签发的签名,用于验证服务器的身份。
- 其他可选消息:根据选定的密钥交换方法,服务器可能还会发送ServerKeyExchange消息(如果服务器证书中的公钥不足以进行密钥交换)和CertificateRequest消息(如果服务器要求客户端进行身份验证)。
3. 密钥交换和验证(ClientKeyExchange + CertificateVerify等)
- 客户端生成预主密钥:客户端验证服务器证书无误后,生成一个预主密钥(Pre-Master Secret),并使用服务器证书中的公钥加密后发送给服务器。
- 发送ClientKeyExchange:客户端发送“ClientKeyExchange”消息,包含加密后的预主密钥。
- 证书验证(如果适用):如果服务器要求客户端证书,客户端会发送自己的证书(Certificate)和CertificateVerify消息,以证明它拥有与证书中公钥相对应的私钥。
4. 握手完成(ChangeCipherSpec + Finished)
- 改变密码规范:客户端和服务器各自发送“ChangeCipherSpec”消息,表示接下来的通信将使用协商好的加密套件和密钥进行加密。
- 发送Finished消息:双方各自计算并发送“Finished”消息,这是一个加密的消息,用于验证之前所有握手消息的正确性,从而确保双方都没有被中间人攻击。如果Finished消息验证成功,则握手过程完成。
5. 加密通信
- 会话密钥生成:客户端和服务器使用预主密钥、客户端随机数和服务器随机数,通过一定的算法生成会话密钥(Session Key)。
- 加密数据传输:握手完成后,客户端和服务器使用会话密钥对传输的数据进行加密和解密,确保通信的机密性和完整性。
6. 连接关闭
- 当客户端和服务器完成通信后,需要终止连接。这通常涉及发送关闭通知(如CloseNotify消息),并等待对方确认关闭。如果一方没有收到关闭通知,可以通过超时机制来关闭连接。