SSL证书握手本质是在不安全网络中建立安全通道,关键点在于身份验证(证书)、密钥交换(对称密钥生成)、数据加密(算法协商)。用户要的“全解析”需要覆盖流程、协议细节和底层原理。因此SSL/TLS协议握手过程是建立安全通信通道的核心,它确保客户端(如浏览器)与服务器之间通信的身份验证、机密性和完整性。以下是基于主流TLS 1.2协议的握手全流程解析(TLS 1.3有简化,文末补充):
TLS 1.2 握手全流程(经典RSA密钥交换为例)
步骤1:ClientHello
客户端 → 服务器
发送支持的TLS版本(如TLS 1.2)
客户端随机数(Client Random,32字节)
支持的密码套件列表(如TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)
支持的压缩算法
SNI(Server Name Indication):指定访问的域名(用于虚拟主机)
步骤2:ServerHello
服务器 → 客户端
确认使用的TLS版本
服务器随机数(Server Random,32字节)
从客户端列表中选择的密码套件(如TLS_RSA_WITH_AES_128_CBC_SHA)
会话ID(Session ID,用于会话恢复)
步骤3:服务器证书(Server Certificate)
服务器 → 客户端
发送服务器的数字证书链(包含公钥):
服务器证书 → 中间CA证书 → 根CA证书(可选)
客户端用预置的根CA证书验证证书链的真实性和有效期。
步骤4:ServerKeyExchange(可选)
服务器 → 客户端
仅用于非RSA密钥交换(如DH、ECDHE):
发送DH/ECDHE参数(如椭圆曲线参数、服务端公钥)
RSA密钥交换无需此步骤(密钥通过证书公钥加密传输)。
步骤5:ServerHelloDone
服务器 → 客户端
表示服务器握手信息发送完毕。
步骤6:ClientKeyExchange
客户端 → 服务器
生成预主密钥(Pre-Master Secret):
对于RSA:客户端生成48字节随机数,用服务器证书公钥加密后发送。
对于DH/ECDHE:客户端基于服务端参数生成临时公钥发送。
此时,双方拥有:
Client Random + Server Random + Pre-Master Secret
→ 通过伪随机函数(PRF) 生成主密钥(Master Secret)。
步骤7:客户端切换加密(ChangeCipherSpec)
客户端 → 服务器
通知服务器:后续消息将使用协商的密钥加密。
步骤8:客户端Finished
客户端 → 服务器
发送加密的Finished消息:
包含之前所有握手消息的HMAC摘要(验证握手完整性,防篡改)。
步骤9:服务器切换加密(ChangeCipherSpec)
服务器 → 客户端
通知客户端:后续消息加密传输。
步骤10:服务器Finished
服务器 → 客户端
发送加密的Finished消息,验证握手完整性。
握手完成后:
会话密钥生成:
双方根据Master Secret生成:
对称加密密钥(如AES密钥)
MAC密钥(完整性校验)
初始化向量(IV,用于CBC模式)
加密通信开始:
后续HTTP等应用层数据通过对称加密传输(如AES-GCM)。
关键安全机制解析
身份验证
客户端通过CA链验证服务器证书(防中间人攻击)。
密钥交换安全
RSA:预主密钥由客户端生成,用服务器公钥加密。
前向保密(PFS):
ECDHE/DHE等算法每次会话生成临时密钥,即使服务器私钥泄露,历史会话也无法解密。
完整性保护
Finished消息的HMAC验证握手过程未被篡改。
TLS 1.3 的简化(重大改进)
握手从2-RTT减少到1-RTT:
客户端在ClientHello中猜测服务器支持的参数,提前生成共享密钥。
废弃不安全特性:
移除RSA密钥交换、静态DH、SHA-1、压缩等。
0-RTT模式(有风险):
对访问过的服务器可携带加密数据(首次请求),但可能遭受重放攻击。
常见问题
证书验证失败:域名不匹配、证书过期、CA不受信任。
密钥交换失败:客户端与服务端密码套件不兼容。
前向保密:务必启用ECDHE/DHE,避免纯RSA密钥交换。
通过以上几个步骤流程详解,SSL证书在不可信网络中建立了可信的加密通道。理解握手细节有助于调试HTTPS问题、优化性能(如启用TLS 1.3)及强化安全配置(如强制PFS)。