插件窝 干货文章 Nginx的SSL/TLS安全配置最佳实践

Nginx的SSL/TLS安全配置最佳实践

SSL Nginx 证书 TLS 995    来源:    2025-04-20

以下是一份详细的Nginx SSL/TLS 安全配置最佳实践指南,涵盖协议选择、加密套件配置、性能优化和安全加固等方面:


1. 使用现代 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。


2. 优化加密套件(Cipher Suites)

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-GCMChaCha20-Poly1305(移动设备友好)。
- TLS 1.2:使用 ECDHE 密钥交换(前向保密),搭配 AES-GCMAES256
- 禁用弱加密算法(如 CBC 模式、SHA1RC4DES)。


3. 证书配置

ssl_certificate     /path/to/fullchain.pem;  # 包含中间证书的链
ssl_certificate_key /path/to/private.key;   # 私钥(权限设为600)

最佳实践
- 使用 ECDSA 证书(如 prime256v1)提升性能,并搭配 RSA 证书作为回退(双证书)。
- 确保证书链完整,避免浏览器警告。
- 私钥必须强加密(推荐 2048/4096 位 RSA 或 256 位 ECC)。


4. 启用 OCSP Stapling

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/chain.pem;  # CA 根证书+中间证书
resolver 8.8.8.8 valid=300s;

作用:减少客户端验证证书时的延迟,提升隐私性(无需向 CA 发送请求)。


5. 强化 DH 参数(仅 TLS 1.2)

openssl dhparam -out /etc/nginx/dhparam.pem 4096  # 生成强参数
ssl_dhparam /etc/nginx/dhparam.pem;  # 在配置中引用

注意:TLS 1.3 不再需要 DH 参数。


6. HSTS 头(强制 HTTPS)

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";

参数说明
- max-age=2年:浏览器强制 HTTPS 缓存时间。
- includeSubDomains:覆盖所有子域名。
- preload:提交到浏览器预加载列表(谨慎使用)。


7. 其他安全头

add_header X-Frame-Options "DENY";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";

8. 性能优化

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 可能面临重放攻击风险,仅对非敏感操作启用。


9. 测试与验证

  • 工具推荐

    • SSL Labs Test(确保评级为 A+)
    • 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";

    # 其他配置...
}

注意事项

  1. 定期更新:关注 OpenSSL 和 Nginx 的安全公告,及时修补漏洞(如 Heartbleed)。
  2. 密钥轮换:定期更换证书和 DH 参数。
  3. 兼容性:若需支持旧客户端(如 Android 4.4),可谨慎添加 ECDHE-RSA-AES128-SHA,但优先保证安全性。

通过以上配置,可显著提升服务的安全性,同时兼顾性能与兼容性。