TLS
→ 返回 计算机网络
TLS(Transport Layer Security,传输层安全)在 TCP 之上提供加密、完整性与身份认证。HTTPS、SMTPS、wss:// 等都是在各自应用协议外包一层 TLS。
TLS 管「怎么安全传」,不是「长连接」;连接是否持久由 HTTP Keep-Alive、WebSocket 等另议。
与 SSL 的关系
| 名称 | 说明 |
|---|---|
| SSL | 早期协议(SSL 2.0/3.0),已废弃,存在已知漏洞 |
| TLS 1.0–1.3 | SSL 的继任者;生产环境应使用 TLS 1.2+(推荐 1.3) |
| 口语 | 仍常说「SSL 证书」「SSL 握手」,实际多为 TLS |
TLS 握手流程(1.2 示意)
客户端 服务端
│── ClientHello(支持的加密套件、随机数)──►│
│◄─ ServerHello(选定套件、随机数)────────│
│◄─ Certificate(服务端证书)─────────────│
│◄─ ServerHelloDone ──────────────────────│
│── ClientKeyExchange(预主密钥)─────────►│
│── ChangeCipherSpec ─────────────────────►│
│── Finished(加密验证)──────────────────►│
│◄─ ChangeCipherSpec ─────────────────────│
│◄─ Finished ─────────────────────────────│
│ 加密通信开始 │
双方用 3 个随机数(客户端随机数 + 服务端随机数 + 预主密钥)派生出对称加密密钥。
TLS 1.3 改进
- 握手从 2-RTT 降至 1-RTT(甚至 0-RTT 恢复连接)
- 废弃 RSA 密钥交换,强制前向保密(ECDHE)
- 移除老旧、不安全的加密套件
证书与 CA
根 CA(内置于操作系统/浏览器)
└── 中间 CA
└── 服务端证书(example.com)
- CA(Certificate Authority):受信任的第三方机构,签发证书
- 证书内容:域名、公钥、有效期、CA 签名
- 验证过程:客户端沿证书链逐级验证签名,直到信任根 CA
证书类型
| 类型 | 说明 |
|---|---|
| DV(域名验证) | 仅验证域名所有权,自动签发,Let’s Encrypt |
| OV(组织验证) | 验证企业信息,显示组织名称 |
| EV(扩展验证) | 严格审查,地址栏显示企业名(部分浏览器已弱化展示) |
| 通配符证书 | *.example.com,覆盖所有子域 |
非对称 + 对称混合加密
| 阶段 | 算法 | 原因 |
|---|---|---|
| 握手阶段 | 非对称加密(RSA / ECDHE) | 安全交换密钥 |
| 数据传输 | 对称加密(AES-GCM) | 高性能,适合大量数据 |
非对称加密计算代价大,只用于密钥协商;实际数据用对称密钥加密。
前向保密(Forward Secrecy)
使用 ECDHE(椭圆曲线 Diffie-Hellman)密钥交换:每次会话生成临时密钥,会话结束后销毁。即使服务器私钥泄露,也无法解密历史流量。
TLS 会话复用
完整握手需要 2-RTT,会话复用可减少开销:
| 机制 | 原理 | 缺点 |
|---|---|---|
| Session ID | 服务端存储会话状态,客户端携带 ID 恢复 | 服务端内存压力,多节点不共享 |
| Session Ticket | 服务端将会话状态加密后发给客户端,下次带回 | ticket 密钥需保护;TLS 1.3 改用 PSK |
| TLS 1.3 PSK | 首次握手后生成预共享密钥,支持 0-RTT 恢复 | 0-RTT 有重放攻击风险,应限 GET |
SNI(服务器名称指示)
同一 IP 托管多个 HTTPS 域名的解决方案:
TLS 握手 ClientHello 中携带目标域名 →
服务端根据域名选择对应证书响应
- 在 TLS 1.2 中 SNI 明文传输(可被中间人看到域名)
- TLS 1.3 引入 ECH(加密 ClientHello),隐藏 SNI
OCSP 与证书撤销
| 机制 | 原理 | 问题 |
|---|---|---|
| CRL(吊销列表) | 下载完整吊销列表 | 文件可能很大,不实时 |
| OCSP | 实时向 CA 查询证书状态 | 依赖 CA 在线,泄露访问记录 |
| OCSP Stapling | 服务端在握手中附带 OCSP 响应 | 推荐,减少客户端请求 |
mTLS(双向 TLS)
标准 TLS 只验证服务端;mTLS 要求客户端也提供证书:
│◄─ CertificateRequest ───────────────│ ← 要求客户端证书
│── Certificate(客户端证书)──────────►│
适用场景:微服务间认证、API 网关、零信任网络。
常见 TLS 攻击与防御
| 攻击 | 原理 | 防御 |
|---|---|---|
| BEAST | 利用 CBC 模式 IV 可预测 | TLS 1.2+,GCM 模式 |
| POODLE | 强制降级到 SSL 3.0 | 禁用 SSL 3.0 及以下 |
| Heartbleed | OpenSSL 心跳扩展内存越界 | 升级 OpenSSL,撤销受影响证书 |
| MITM 降级 | 中间人协商弱加密 | 禁用弱套件,HSTS(见 HTTPS) |
| 证书伪造 | 恶意 CA 签发假证书 | 证书透明度(CT) |
证书透明度(Certificate Transparency)
CA 签发证书 → 必须写入公开 CT 日志 → 浏览器校验 SCT
- 可通过 crt.sh 查询某域名的历史证书
抓包与调试
openssl s_client -connect example.com:443 -showcerts
echo | openssl s_client -connect example.com:443 2>/dev/null \
| openssl x509 -noout -dates