SSL/TLS 配置已发生重大变化。这是截至 2026 年的最佳实践现状——该启用什么、该禁用什么,以及即将到来的变化。
协议版本
| 协议 | 状态 | 操作 |
|---|---|---|
| SSL 2.0, 3.0 | 已破解 | 禁用 —— 存在严重漏洞(POODLE、DROWN) |
| TLS 1.0 | 已弃用(2021) | 禁用 —— BEAST 漏洞 |
| TLS 1.1 | 已弃用(2021) | 禁用 —— 不支持现代密码套件 |
| TLS 1.2 | 安全 | 启用 —— 仅使用 AEAD 密码套件 |
| TLS 1.3 | 当前标准 | 启用 —— 最快、最安全 |
Nginx: ssl_protocols TLSv1.2 TLSv1.3;
Apache: SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
密码套件
TLS 1.3(无需配置)
全部 5 个密码套件都是安全的。不要试图自定义——你无法让它更好。
TLS 1.2(限制为仅 AEAD)
# Nginx
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers off;
规则:
- 仅
ECDHE-*套件 —— 确保前向保密 - 仅
*-GCM-*或*-CHACHA20-*—— 仅 AEAD 密码 - 无 CBC 密码 —— 易受 BEAST、Lucky13 攻击
ssl_prefer_server_ciphers off—— 让客户端选择(现代客户端会选最佳选项)
证书管理
| 实践 | 原因 |
|---|---|
| 使用 ECDSA P-256 密钥 | 比 RSA 2048 更小、更快 |
| 自动续签 | 2029 年 47 天有效期使手动续签不可行 |
提供 fullchain.pem | 防止信任链错误 |
| 监控证书过期 | 在第 60 天设置告警(90 天有效期) |
| 使用证书透明度监控 | 捕获未授权证书 |
| 续签时轮换密钥 | 不要在证书间复用私钥 |
安全头
# HSTS — always use HTTPS (start with short max-age, increase later)
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
# Prevent MIME-type sniffing
add_header X-Content-Type-Options "nosniff" always;
# Prevent clickjacking
add_header X-Frame-Options "SAMEORIGIN" always;
# Upgrade insecure sub-resources
add_header Content-Security-Policy "upgrade-insecure-requests" always;
性能优化
| 设置 | 配置 | 收益 |
|---|---|---|
| HTTP/2 | listen 443 ssl http2; | 多路复用、头部压缩 |
| 会话缓存 | ssl_session_cache shared:SSL:10m; | 避免回访者重新握手 |
| 关闭会话票证 | ssl_session_tickets off; | 更好的前向保密 |
| OCSP Stapling | ssl_stapling on; | 更快的证书验证、更好的隐私 |
| 早期数据(0-RTT) | TLS 1.3 默认 | 零延迟恢复(谨慎使用) |
完整 Nginx 配置(生产就绪)
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/ssl/fullchain.pem;
ssl_certificate_key /etc/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
root /var/www/html;
}
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
测试: 在 SSL Labs 输入你的域名——此配置应得到 A+ 评分。
不要做什么
| 错误实践 | 原因 | 正确做法 |
|---|---|---|
ssl_protocols TLSv1 TLSv1.1; | 已弃用、有漏洞 | 仅 TLS 1.2 + 1.3 |
ssl_ciphers ALL; | 包含弱密码 | 明确的 ECDHE + AEAD 列表 |
ssl_prefer_server_ciphers on;(TLS 1.3) | 不必要——TLS 1.3 密码都安全 | off |
使用 cert.pem 而非 fullchain.pem | 缺少链 → 信任错误 | Nginx 始终用 fullchain.pem |
| 生产环境用自签名证书 | 浏览器警告、无信任 | Let’s Encrypt(免费) |
| 多年使用同一私钥 | 限制损害控制 | 每次续签轮换 |
| 不用 HSTS | 易受降级攻击 | 测试后启用 |
HSTS 的 max-age=0 | 实际上禁用了 HSTS | 从 300 开始,增加到 63072000 |
常见问题
如何测试我的 SSL 配置?
SSL Labs Server Test —— 输入域名,获得 A-F 评级的详细报告。检查协议支持、密码强度、链有效性和已知漏洞。
应该追求什么评级?
生产站点追求 A+。要求:仅 TLS 1.2+、AEAD 密码、有效链、长 max-age 的 HSTS。上述配置可达到 A+。
应该多久审查一次 SSL 配置?
每年一次,或在新漏洞公布时。订阅 Let’s Encrypt 状态页并关注 Mozilla SSL Configuration Generator 获取更新建议。
有工具能为我生成正确配置吗?
有 —— Mozilla SSL Configuration Generator。选择你的服务器(Nginx、Apache 等)和版本,它会生成推荐配置。“Modern”配置文件与本文的实践相匹配。