# tls-learn **Repository Path**: prefer2023/tls-learn ## Basic Information - **Project Name**: tls-learn - **Description**: 简单学习https加密通信 - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-04 - **Last Updated**: 2025-04-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # TLS 1.2 完整握手流程(基于 ECDHE 密钥交换) ## 1. 握手流程总览 以下是 TLS 1.2 使用 ​ECDHE​(Ephemeral Elliptic Curve Diffie-Hellman)密钥交换的完整握手流程,包含 ​前向安全性​(Forward Secrecy)支持: ``` 客户端 服务端 | | | 1. Client Hello | | - TLS 版本、加密套件列表、Client Random | |----------------------------------------->| | | | 2. Server Hello | | - 选定 TLS 版本、加密套件、Server Random | |<-----------------------------------------| | | | 3. Certificate | | - 服务端证书链(含 ECDSA/RSA 公钥) | |<-----------------------------------------| | | | 4. Server Key Exchange | | - ECDHE 参数(椭圆曲线、临时公钥) | | - 用服务端私钥签名参数 | |<-----------------------------------------| | | | 5. Server Hello Done | |<-----------------------------------------| | | | 6. Client Key Exchange | | - 客户端临时 ECDH 公钥 | |----------------------------------------->| | | | 7. Change Cipher Spec | | - 通知切换至加密通信 | |----------------------------------------->| | | | 8. Finished(Encrypted) | | - 加密的握手消息哈希,验证密钥一致性 | |----------------------------------------->| | | | 9. Change Cipher Spec | |<-----------------------------------------| | | | 10. Finished(Encrypted) | |<-----------------------------------------| | | |===== 应用数据加密传输(如 HTTP) ===========>| ``` ## 2. 详细步骤解析 ### ​2.1 Client Hello 客户端发起握手,发送以下信息: ​TLS 版本:支持的最高版本(如 TLS 1.2)。 ​随机数(Client Random)​:32 字节随机值,后续用于密钥生成。 ​加密套件列表:如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。 ​扩展字段: ​SNI(Server Name Indication)​:指明访问的域名。 ​支持的椭圆曲线:如 secp256r1、x25519。 ​签名算法:如 ecdsa_secp256r1_sha256。 ### ​2.2 Server Hello 服务端响应,确认协商参数: ​TLS 版本:双方支持的最高版本。 ​随机数(Server Random)​:32 字节随机值。 ​选定的加密套件:如 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256。 ​扩展字段:确认椭圆曲线类型(如 secp256r1)。 ### ​2.3 Certificate 服务端发送证书链: ​证书链:包含服务端证书及中间 CA 证书。 ​公钥用途:验证服务端身份(证书中的公钥用于签名验证)。 ### ​2.4 Server Key Exchange 服务端生成临时 ECDH 密钥对,并发送: ​椭圆曲线参数: 曲线名称(如 prime256v1)。 基点(Generator)的坐标(可选,若未预定义)。 ​服务端临时 ECDH 公钥:server_ephemeral_public_key。 ​签名:用服务端私钥对参数签名(防止中间人篡改)。 ### ​2.5 Server Hello Done 服务端标记握手参数发送完成。 ### ​2.6 Client Key Exchange 客户端生成临时 ECDH 密钥对,发送: ​客户端临时 ECDH 公钥:client_ephemeral_public_key。 ### ​2.7 预主密钥(Pre-Master Secret)计算 双方通过 ECDH 算法生成共享密钥: ​客户端计算: pre_master_secret = client_ephemeral_private_key * server_ephemeral_public_key。 ​服务端计算: pre_master_secret = server_ephemeral_private_key * client_ephemeral_public_key。 ### ​2.8 主密钥(Master Secret)生成 使用 PRF(Pseudo-Random Function)生成主密钥: master_secret = PRF( pre_master_secret, "master secret", ClientRandom + ServerRandom ) ​PRF 实现:TLS 1.2 使用 HMAC-SHA256 分阶段扩展。 ### ​2.9 会话密钥(Key Block)派生 从主密钥派生出对称加密密钥: key_block = PRF( master_secret, "key expansion", ServerRandom + ClientRandom ) 按加密套件需求分割为: ​客户端写密钥(Client Write Key)​:AES-128 密钥(16 字节)。 ​服务端写密钥(Server Write Key)​:AES-128 密钥(16 字节)。 ​客户端 HMAC 密钥(Client HMAC Key)​:SHA-256 密钥(32 字节)。 ​服务端 HMAC 密钥(Server HMAC Key)​:SHA-256 密钥(32 字节)。 ​初始化向量(IV)​​(如使用 CBC 模式)。 ### ​2.10 Change Cipher Spec 双方通知对方切换至加密通信模式。 ### ​2.11 Finished 消息验证 ​客户端发送 Finished: 用 Client Write Key 加密握手消息哈希,验证密钥一致性。 ​服务端发送 Finished: 用 Server Write Key 加密握手消息哈希,验证密钥一致性。 ## ​3. 加密通信 握手完成后,应用数据(如 HTTP 请求)通过以下方式加密传输: ​分块加密: 使用 AES-128-CBC 或 AES-GCM 加密数据块。 ​完整性校验: HMAC-SHA256 生成校验码(CBC 模式)或 GCM 集成校验。 ​数据封装: 每个 TLS 记录包含加密后的数据、HMAC 校验码和序列号。 ## ​4. 安全性关键点 ​前向安全性: 临时 ECDH 密钥对仅在单次会话中使用,即使长期私钥泄露,历史会话仍安全。 ​身份验证: 服务端证书验证确保通信方身份合法。 ​防篡改: Finished 消息验证确保握手过程未被中间人篡改。 ## 5. 流程图 ``` +-----------+ +-----------+ | Client | | Server | +-----------+ +-----------+ | | | 1. Client Hello | |----------------------------------------->| | 2. Server Hello, Certificate, | | Server Key Exchange, Server Hello Done| |<-----------------------------------------| | 3. Client Key Exchange | |----------------------------------------->| | 4. Change Cipher Spec, Finished | |----------------------------------------->| | 5. Change Cipher Spec, Finished | |<-----------------------------------------| |=== 加密应用数据传输 =========================>| ``` ## 6. 相关加密套件示例 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 密钥交换:ECDHE-RSA 认证:RSA 加密:AES-128-GCM 哈希:SHA256 ## ​7. 注意事项 ​证书验证:客户端需验证服务端证书链的有效性(CA 签名、有效期、吊销状态)。 ​临时密钥:服务端必须生成临时 ECDH 密钥对,否则无法实现前向安全。 ​算法弃用:避免使用不安全的椭圆曲线(如 secp192r1)和哈希算法(如 SHA-1)。 通过此流程,TLS 1.2 使用 ECDHE 实现了高效且安全的通信,适用于现代 Web 服务和企业级加密需求。 ## 项目介绍 本项目模拟了HTTPS握手的全过程,包括客户端和服务端的随机数交换、ECDH密钥交换、证书验证、预主密和主密的生成、会话密钥的生成等步骤。通过本项目,可以深入了解HTTPS握手的内部机制和加密通信的原理。 ### 使用方法 npm install node server.js node client.js