以下是一份详细的Nginx SSL/TLS 安全配置最佳实践指南,涵盖协议选择、加密套件配置、性能优化和安全加固等方面:
ssl_protocols TLSv1.2 TLSv1.3; # 禁用旧版协议(TLSv1.0/1.1 和 SSLv3)
理由:
- TLS 1.3 提供更好的性能与安全性(如 1-RTT 握手)。
- TLS 1.2 是当前最低推荐版本,禁用已不安全的 TLS 1.0/1.1。
ssl_ciphers 'TLS13+AESGCM+AES128:TLS13+AESGCM+AES256:TLS13+CHACHA20:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
关键点:
- TLS 1.3:优先使用 AES-GCM
或 ChaCha20-Poly1305
(移动设备友好)。
- TLS 1.2:使用 ECDHE
密钥交换(前向保密),搭配 AES-GCM
或 AES256
。
- 禁用弱加密算法(如 CBC
模式、SHA1
、RC4
、DES
)。
ssl_certificate /path/to/fullchain.pem; # 包含中间证书的链
ssl_certificate_key /path/to/private.key; # 私钥(权限设为600)
最佳实践:
- 使用 ECDSA 证书(如 prime256v1
)提升性能,并搭配 RSA 证书作为回退(双证书)。
- 确保证书链完整,避免浏览器警告。
- 私钥必须强加密(推荐 2048/4096 位 RSA 或 256 位 ECC)。
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/chain.pem; # CA 根证书+中间证书
resolver 8.8.8.8 valid=300s;
作用:减少客户端验证证书时的延迟,提升隐私性(无需向 CA 发送请求)。
openssl dhparam -out /etc/nginx/dhparam.pem 4096 # 生成强参数
ssl_dhparam /etc/nginx/dhparam.pem; # 在配置中引用
注意:TLS 1.3 不再需要 DH 参数。
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
参数说明:
- max-age=2年
:浏览器强制 HTTPS 缓存时间。
- includeSubDomains
:覆盖所有子域名。
- preload
:提交到浏览器预加载列表(谨慎使用)。
add_header X-Frame-Options "DENY";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1h;
ssl_buffer_size 4k; # TLS 1.3 建议小缓冲区
ssl_early_data on; # 启用 0-RTT(需评估安全风险)
说明:
- 会话复用(Session Resumption)减少握手开销。
- early_data
可能面临重放攻击风险,仅对非敏感操作启用。
工具推荐:
openssl s_client -connect example.com:443 -tls1_2
(手动测试协议)nmap --script ssl-enum-ciphers -p 443 example.com
(检查加密套件)日志监控:
error_log /var/log/nginx/ssl_error.log warn;
server {
listen 443 ssl http2;
server_name example.com;
# 证书配置
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/private.key;
# 协议与加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS13+AESGCM+AES128:TLS13+AESGCM+AES256:ECDHE-ECDSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
# 性能与安全
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1h;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_stapling on;
ssl_stapling_verify on;
# 安全头
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options "DENY";
# 其他配置...
}
ECDHE-RSA-AES128-SHA
,但优先保证安全性。通过以上配置,可显著提升服务的安全性,同时兼顾性能与兼容性。