外观
一句话答案
HTTPS = HTTP + TLS 加密,握手:Client Hello→Server Hello+证书→密钥交换→对称加密通信。
核心要点
TLS 1.2 握手(4次往返,2-RTT):
客户端 服务端
│── ClientHello ──────────────────→│
│ (支持的TLS版本, 加密套件列表, │
│ 客户端随机数 C_Random) │
│ │
│← ServerHello ──────────────────── │
│ (选定的TLS版本, 加密套件, │
│ 服务端随机数 S_Random) │
│ │
│← Certificate ──────────────────── │
│ (服务端的数字证书,含公钥) │
│ │
│← ServerHelloDone ──────────────── │
│ │
│── ClientKeyExchange ────────────→│
│ (用服务端公钥加密的 pre-master │
│ secret,或 ECDHE 的客户端公钥) │
│ │
双方各自根据:C_Random + S_Random + pre-master secret
生成相同的 Master Secret → 派生出对称加密密钥
│ │
│── ChangeCipherSpec ─────────────→│ 切换到加密模式
│── Finished(加密)──────────────→│
│← ChangeCipherSpec ─────────────── │
│← Finished(加密)──────────────── │
│ │
─────── 握手完成,开始加密通信 ──────TLS 1.3 优化(1-RTT,甚至 0-RTT):
- 精简了握手,去掉了 ServerHelloDone、ChangeCipherSpec 等消息
- 只支持前向安全的密钥交换算法(ECDHE),不再支持 RSA 静态密钥交换
- 0-RTT 恢复会话(Session Resumption)
客户端如何验证 CA 证书的有效性:
证书链验证:
服务端证书(由中间 CA 签名)
→ 中间 CA 证书(由根 CA 签名)
→ 根 CA 证书(由操作系统/浏览器内置信任)
验证流程:
1. 用中间 CA 的公钥验证服务端证书的签名 → 合法(确认证书是中间 CA 颁发的)
2. 用根 CA 的公钥验证中间 CA 证书的签名 → 合法
3. 根 CA 证书在操作系统受信任根证书列表中 → 整个链可信其他验证项:
- 域名匹配:证书中的 CN(Common Name)或 SAN 是否与访问的域名一致
- 有效期:证书是否在有效期内(notBefore ~ notAfter)
- 吊销状态:
- CRL(Certificate Revocation List):下载吊销列表检查
- OCSP(Online Certificate Status Protocol):在线实时查询证书状态
追问与易错
追问方向:
- 对称加密和非对称加密各用在哪?(非对称交换密钥,对称加密传输数据)
- 数字证书怎么验证真伪?(CA 签名 + 证书链验证)
- HTTPS 比 HTTP 慢多少?怎么优化?(TLS 握手增加 1-2 RTT,Session 复用/TLS 1.3 优化)
易错点:
- ❌ "HTTPS 全程非对称加密"——只有密钥交换用非对称,数据传输用对称(性能考虑)
- ❌ "有了 HTTPS 就绝对安全"——中间人攻击仍可能(如客户端不验证证书)
💡 记忆锚点
TLS握手像当面交换密码本:先用非对称加密(公钥像公开的锁,只有私钥能打开)安全地把"密码本"(对称密钥)交给对方,之后所有通信都用这本密码本加解密(快)。证书像身份证,由CA(公安局)盖章担保身份。三个随机数(C_Random + S_Random + pre-master)合成最终密钥,防止单点泄露。