一、HTTPS握手的两个核心目标
HTTPS 握手的核心是同时实现 2个功能,这两个功能嵌套在同一段交互流程中:
- 证书校验:验证服务器身份(防冒充),是密钥交换的安全前提;
- 密钥交换:协商对称会话密钥(防窃听),是握手的最终目的。
服务器在密钥交换的初期,主动发送证书;客户端先校验证书,只有校验通过,才会继续参与密钥交换。
二、 整体架构流程
- 发起协商:客户端与服务器交换基础参数,确定加密算法套件
- 身份+密钥双验证:服务器发送证书,客户端完成证书校验;双方交换临时公钥并验签,计算共享密钥
- 加密通信:生成会话密钥,切换加密模式,传输HTTP数据
三、两大核心剖析
核心一:证书校验(身份认证,防中间人冒充)
证书是服务器的"网络身份证",由权威CA签发,客户端必须完成4步必验流程,校验失败则直接终止握手。
- 验证书链签名
- 操作逻辑:服务器发送的不是单张证书,而是证书链(根证书→中间证书→服务器证书)。客户端用上层证书的公钥,逐级验证下层证书的数字签名,最终追溯到浏览器/操作系统内置的根证书(根证书自签名,是信任源头)。
- 作用:证明服务器证书是CA合法签发,且内容未被篡改。
- ❌ 面试易错点:误以为只验证服务器证书,忽略证书链的层级验证;混淆"根证书内置"的特性,认为根证书需要额外传输。
- 验证书有效性(3个关键检查)
- 有效期检查:确认当前时间在证书的 NotBefore 和 NotAfter 之间,过期证书直接失效。
- 域名匹配检查:优先校验证书的 SAN字段(可绑定多个域名),而非CN字段;只有SAN字段与访问域名一致,才算验证通过。
- 用途检查:确认证书的"扩展密钥用法"标注为 TLS Web Server Authentication ,防止误用邮件加密等其他用途的证书。
- ❌ 面试易错点:认为浏览器优先校验CN字段;忽略证书用途检查的必要性。
- 验证书吊销状态(避免"作废身份证")
- 操作方式:通过OCSP在线查询(主流方案,实时性强)或CRL离线列表,确认证书是否因私钥泄露等原因被吊销。
- ✅ 面试关键点:证书即使在有效期内,被吊销后也绝对不能使用,这是很多初学者的遗漏点。
- 核心坑点总结(面试高频提问)
- 客户端从不接触服务器私钥,私钥仅保存在服务器本地,用于签名和解密。
- 证书校验的核心是"验证身份合法性",而非"加密数据"。
核心二:密钥交换(协商暗号,防数据窃听)
以面试最高频的ECDHE-RSA算法为例(支持前向保密,现代主流方案),拆解密钥交换的底层逻辑,其他算法可类比推导。
- 前置条件:算法参数约定
- 客户端在 ClientHello 中携带支持的椭圆曲线参数,服务器选定后,双方确定公共基点G(TLS协议固定公开参数,如secp256r1曲线的G坐标)。
- ✅ 面试关键点:双方必须使用同一个G,否则无法算出相同的共享密钥。
- 核心步骤:3步生成共享密钥
| 步骤 | 服务器操作 | 客户端操作 |
|---|---|---|
| 生成临时密钥对 | 生成一次性私钥 ks (自留),计算公钥 Ps = ks × G;用证书长期私钥给 Ps 签名 | 证书校验通过后,生成一次性私钥 kc (自留),计算公钥 Pc = kc × G |
| 交换并验签公钥 | 发送带签名的Ps 给客户端 | 用证书公钥验证Ps 签名,防中间人篡改;验证通过后发送 Pc 给服务器 |
| 计算共享密钥 | 本地计算:ks × Pc = ks × kc × G = Secret | 本地计算:kc × Ps = kc × ks × G = Secret |
- 底层原理:依赖椭圆曲线点乘交换律( kc×ks = ks×kc ),双方最终得到完全相同的共享密钥 Secret 。
- 安全核心: Secret 全程不在网络中传输,仅双方能通过私钥+对方公钥计算得出,中间人无法窃听。
- 会话密钥衍生(最终加密密钥)
双方将 客户端随机数Rc + 服务器随机数Rs + 共享密钥Secret 输入伪随机函数(PRF),生成 master secret ,再衍生出3类密钥:
- 加密密钥(如AES-256-GCM):用于加密HTTP数据
- MAC密钥(如HMAC-SHA384):用于验证数据完整性,防篡改
- IV(初始化向量):防止相同明文加密出相同密文
- 前向保密(面试必问核心)
- 定义:服务器长期私钥泄露后,历史会话的通信内容也无法被破解。
- 实现原因:ECDHE的会话密钥基于一次性临时密钥对生成,与服务器长期私钥无关;会话结束后,临时密钥对立即销毁。
- 对比RSA算法:RSA用客户端生成的 Pre-Master Secret (用服务器长期公钥加密传输),依赖长期私钥,不支持前向保密。
- 临时公钥签名的作用(防中间人攻击关键)
- 服务器必须用证书长期私钥给 Ps 签名,客户端验签通过后才会继续计算密钥。
- ❌ 面试易错点:忽略签名步骤的作用------若中间人篡改 Ps 为自己的公钥,验签会失败,客户端直接终止握手,避免生成错误密钥。
四、关键概念对比
| 概念 | 核心作用 | 面试区分要点 |
|---|---|---|
| 公钥加密 | 加密小数据(如密钥)、验签 | 公钥加密,私钥解密;私钥签名,公钥验签 |
| 对称加密 | 加密大数据(如HTTP数据) | 速度快,密钥需保密;HTTPS中仅用于数据传输 |
| 证书校验 | 验服务器身份 | 4步必验,嵌套在密钥交换流程中 |
| 前向保密 | 历史会话防破解 | 仅基于临时密钥对的算法(ECDHE/DHE)支持 |
五、关于HTTPS密钥交换+证书校验的相关面试题
- 为什么不用服务器长期私钥直接做Diffie-Hellman?
答:长期私钥是固定不变的,若失窃,历史流量可被解密;而ECDHE使用一次性临时密钥对,即使长期私钥泄露,历史会话也无法破解(即前向保密)。
- 证书里的公钥与ServerKeyExchange里的临时公钥有何区别?
答:① 用途不同:证书公钥用于验签+加密临时密钥(是长期稳定的);临时公钥仅用于本次会话的DH计算(是一次性的);② 生命周期不同:证书公钥与证书有效期一致,临时公钥仅在本次握手有效。
- 客户端如何验证握手过程未被篡改?
答:握手最后阶段,双方发送的 Finished 消息会携带覆盖全部握手记录的HMAC校验值;若握手过程中任何一步被篡改,HMAC值会不匹配,验证失败,握手终止。
- ECDHE-RSA为什么支持前向保密?RSA算法为什么不支持?
答:ECDHE-RSA的会话密钥基于一次性临时密钥对生成,与服务器长期私钥无关;而RSA算法的会话密钥依赖客户端用服务器长期公钥加密的 Pre-Master Secret ,长期私钥泄露则历史会话可被破解。
- 高并发场景为什么优先选择ECDHE-RSA算法?
答:① 安全性:支持前向保密,历史会话防破解;② 性能:椭圆曲线计算效率高,256位椭圆曲线密钥的安全性≈3072位RSA密钥,但计算成本更低,更适配高并发场景。