核心要求:禁用不安全的旧版本协议(如SSLv3、TLSv1.0、TLSv1.1),仅启用TLSv1.2及以上版本(尤其是TLSv1.3)。
ssl_protocols TLSv1.2 TLSv1.3;
TLSv1.3相比TLSv1.2进一步简化了握手流程(减少往返次数)、移除了不安全的加密算法(如CBC模式),安全性更高,建议优先启用。核心原则:选择支持前向保密(Forward Secrecy)、抗量子攻击能力强的加密算法组合,优先使用AEAD(Authenticated Encryption with Associated Data)模式(如GCM、ChaCha20)。
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
TLS_AES_*:TLS 1.3原生支持的加密套件,无需密钥交换协商,安全性最高;ECDHE-*:采用椭圆曲线迪菲-赫尔曼(ECDHE)密钥交换,实现前向保密(即使私钥泄露,过往通信也无法解密);AES-GCM/ChaCha20-Poly1305:提供加密与完整性校验一体化,性能优于传统CBC模式。ssl_prefer_server_ciphers on;
关键组件:前向保密依赖ECDHE密钥交换和强Diffie-Hellman(DH)参数。
sudo openssl dhparam -out /usr/local/nginx/ssl/certs/dhparam.pem 2048
ssl_dhparam /usr/local/nginx/ssl/certs/dhparam.pem;
作用:通过HTTP响应头Strict-Transport-Security强制浏览器仅通过HTTPS访问网站,防止中间人攻击(如SSL剥离)。
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
max-age=31536000:有效期1年(单位:秒);includeSubDomains:覆盖所有子域名;preload:允许浏览器将域名加入预加载列表(提前强制HTTPS)。作用:服务器预先获取证书吊销状态(OCSP响应),并在TLS握手时传递给客户端,减少客户端向CA查询的时间(避免隐私泄露),同时提升握手效率。
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /usr/local/nginx/ssl/certs/chain.pem; # 证书链文件路径
resolver 8.8.8.8 8.8.4.4 valid=300s; # DNS解析器配置
ssl_trusted_certificate需指向包含完整证书链的文件(如CA颁发的中间证书+服务器证书)。sudo nginx -t
certbot renew --dry-run测试),或设置Cron任务定期检查证书过期时间。通过以上步骤,可选择并配置Nginx的SSL加密级别,实现高安全性(抵御常见攻击)、高性能(优化握手效率)的平衡。需根据实际业务需求(如客户端兼容性)调整加密套件,但核心原则始终是“禁用旧协议、启用强加密、强化密钥安全”。