Nginx通过严格配置ssl_protocols TLSv1.2 TLSv1.3和白名单式ssl_ciphers(仅含ECDHE/DHE+AES-GCM/CHACHA20-POLY1305),在TLS握手阶段直接拒绝含3DES、RC4、MD5、SHA1等弱算法的连接,实现本质安全。

要让 Nginx 拒绝使用弱加密算法(如 3DES、RC4、MD5、SHA1、SSLv2/v3)的 TLS 连接,核心不是“拦截请求”,而是**在 TLS 握手阶段直接拒绝不合规的协商**——即通过严格配置 ssl_ciphers 和 ssl_protocols,让不支持强密码套件的客户端根本无法建立 HTTPS 连接。
明确禁用弱协议和弱密码套件
Nginx 本身不提供运行时“检查已建立连接的加密强度并中断”的能力,但可通过以下配置,在 TLS 握手时就排除所有含弱算法的 cipher suite:
- 设置
ssl_protocols TLSv1.2 TLSv1.3;(彻底禁用 SSLv2/v3、TLSv1.0/1.1) - 使用严格白名单式
ssl_ciphers,只保留前向安全(PFS)、AEAD、密钥长度 ≥128 位的套件,例如:
该列表不含任何 3DES(如 ECDHE-RSA-DES-CBC3-SHA)、RC4(如 ECDHE-RSA-RC4-SHA)、MD5 或 SHA1 签名的套件,也排除了静态 RSA 密钥交换(无前向安全)。
启用严格 TLS 参数强化安全性
仅靠 cipher 列表不够,还需配合其他指令确保策略生效:
-
ssl_prefer_server_ciphers on;:强制服务端选择 cipher,避免客户端强行降级 -
ssl_ecdh_curve secp384r1:secp521r1;(或prime256v1):指定强椭圆曲线,避免使用弱曲线(如sect163k1) -
ssl_dhparam /path/to/dhparam.pem;:若使用 DHE 套件,需提供 ≥2048 位 DH 参数(推荐 3072+),避免 Logjam 攻击
验证配置是否生效
重启 Nginx 后,用以下方式确认弱算法已被屏蔽:
- 使用
openssl s_client -connect example.com:443 -cipher "RC4" -tls1_2测试:应返回handshake failed或no ciphers available - 用 SSL Labs Test 扫描域名,检查 “Handshake Simulation” 中老旧客户端(如 WinXP/IE6、Android 4.4)是否全部显示 “No SNI” 或 “Failed”
- 查看 Nginx error log:若出现
no suitable signature algorithm或ssl handshake failed,说明握手被正常拒止
注意兼容性与运维建议
完全禁用 TLSv1.0–1.1 和所有非 AEAD 套件会切断极少数老旧系统(如 Windows XP SP2、Java 6u45 以下、OpenSSL
- 先在非核心域名或灰度集群中验证配置
- 结合 access_log 或 $ssl_cipher 变量记录协商结果(如
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$ssl_protocol/$ssl_cipher"';),观察真实客户端使用的 cipher 分布 - 定期更新 cipher 列表,参考 Mozilla SSL Configuration Generator 的 modern 或 intermediate 推荐











