配置 TLS 1.3 实现安全通信
概述
TLS 1.3(RFC 8446)是传输层安全协议的最新版本,在安全性和性能方面相比 TLS 1.2 有显著改进。它将握手延迟降低至 1-RTT(会话恢复时为 0-RTT),移除了过时的密码套件,并强制要求完美前向保密(PFS)。本技能涵盖在服务器上配置 TLS 1.3、验证配置以及测试常见错误配置。
目标
- 在 nginx 和 Apache Web 服务器上配置 TLS 1.3
- 使用 Python ssl 模块在应用程序中实施 TLS 1.3
- 使用 openssl 和 testssl.sh 验证 TLS 配置
- 了解 TLS 1.3 密码套件和密钥交换机制
- 配置具有适当保护的 0-RTT 早期数据
- 禁用旧版 TLS(1.0、1.1)和弱密码套件
核心概念
TLS 1.3 密码套件
| 密码套件 | 密钥交换 | 认证 | 加密 | 哈希 |
|---|---|---|---|---|
| TLS_AES_256_GCM_SHA384 | ECDHE/DHE | 证书 | AES-256-GCM | SHA-384 |
| TLS_AES_128_GCM_SHA256 | ECDHE/DHE | 证书 | AES-128-GCM | SHA-256 |
| TLS_CHACHA20_POLY1305_SHA256 | ECDHE/DHE | 证书 | ChaCha20-Poly1305 | SHA-256 |
TLS 1.3 vs 1.2 改进
- 1-RTT 握手:完整握手在一个往返内完成(TLS 1.2 需要 2 个)
- 0-RTT 恢复:恢复连接可立即发送数据
- 无 RSA 密钥交换:仅使用临时 Diffie-Hellman(强制 PFS)
- 简化密码套件:移除了 CBC、RC4、3DES、静态 RSA、SHA-1
- 加密握手:服务器证书在 ServerHello 之后加密传输
密钥交换组
- x25519:Curve25519 ECDH(首选,速度快)
- secp256r1:NIST P-256 ECDH(广泛支持)
- secp384r1:NIST P-384 ECDH(更高安全裕度)
- x448:Curve448 ECDH(最高安全性)
实施步骤
- 验证 OpenSSL 版本支持 TLS 1.3(1.1.1 及以上)
- 生成或获取 TLS 证书和私钥
- 配置服务器使用 TLS 1.3 密码套件
- 禁用 TLS 1.0 和 1.1(可选保留 1.2 以兼容旧版)
- 设置首选密钥交换组
- 启用 OCSP stapling 进行证书验证
- 使用 openssl s_client 和 testssl.sh 测试配置
- 配置 HSTS 头部实现 HTTP 严格传输安全
安全注意事项
- 0-RTT 数据容易受到重放攻击;限制为幂等请求
- 如需支持旧版客户端,始终包含 TLS 1.2 回退
- 使用 ECDSA 证书获得更好性能(相比 RSA)
- 启用 OCSP stapling 以改进客户端证书验证
- 将 HSTS 头部设置较长的 max-age 并包含 includeSubDomains
- 监控证书透明度日志
验证标准
- TLS 1.3 握手成功完成
- 仅提供已批准的密码套件
- 完美前向保密得到执行
- TLS 1.0 和 1.1 被拒绝
- OCSP stapling 正常工作
- 证书链有效且完整
- testssl.sh 未报告漏洞