直接在 nginx 的 https server 块中配置 ssl_protocols tlsv1.2 tlsv1.3 和白名单式 ssl_ciphers(如 ecdhe+aes-gcm/chacha20-poly1305),并保持 ssl_prefer_server_ciphers off,即可在 tls 握手阶段主动拒绝含 des、3des、rc4、md5、sha1 等弱算法的连接,堵住 sweet32 等漏洞利用路径。

直接在 Nginx 的 HTTPS server 块中配置 ssl_protocols 和 ssl_ciphers,就能有效禁用 DES、3DES、RC4、MD5、SHA1 等弱加密算法,堵住 CVE-2016-2183(SWEET32)等已知漏洞的利用路径。
必须在每个 server 块里写明协议版本
只启用 TLSv1.2 和 TLSv1.3,旧协议自然失效:
- 在每个监听 443 端口并启用 SSL 的
server块中添加:ssl_protocols TLSv1.2 TLSv1.3; - 不能写在
http或location块里——这些位置无效 - 不能包含
TLSv1(等价于 TLSv1.0)、TLSv1.1或all,否则会意外开启不安全协议 - 多个域名或虚拟主机配置文件(如
sites-enabled/下各 conf),每个都要单独加这一行
显式排除弱算法,而不是依赖默认值
Nginx 默认配置可能仍含 3DES 或 RC4,必须主动剔除:
- 推荐使用白名单式写法(清晰、可控):
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305"; - 或使用排除式语法(更简洁):
ssl_ciphers HIGH:!aNULL:!MD5:!RC4:!3DES:!DES:!EXPORT:!SHA1:!DSS; - 确保不含
CBC模式(如AES128-CBC-SHA)、静态 RSA、RC4、DES、3DES、MD5、SHA1 - 不要留空、不要写
DEFAULT,避免旧版 OpenSSL 回退到弱套件
配合关键参数防止协商绕过
仅改协议和套件还不够,客户端可能绕过策略:
-
ssl_prefer_server_ciphers off;—— 必须关闭(Nginx 1.11.0+ 默认值),否则 TLSv1.3 会被禁用 - 若使用 OpenSSL ≥ 1.1.1 编译的 Nginx,TLSv1.3 才能真正启用;旧版本无法支持
- 不建议启用
ssl_dhparam时使用过短 DH 密钥(如 1024 位),应至少 2048 位或改用 ECDHE
验证是否真正生效
配置重载后必须实测,不能只看 nginx -t 通过:
- 用 nmap 扫描:
nmap --script ssl-enum-ciphers -p 443 your-domain.com
确认输出中无3DES、RC4、DES、MD5、SHA1,且无标记为weak或broken的条目 - 用 openssl 测试旧协议是否被拒:
openssl s_client -connect your-domain.com:443 -tls1_1 -servername your-domain.com
应返回握手失败(如SSL routines:tls_process_server_hello:protocol is down) - 浏览器打开站点 → 开发者工具 → Security 标签页 → 查看实际协商的 Cipher Suite,应为类似
TLS_AES_128_GCM_SHA256(TLS 1.3)或ECDHE-RSA-AES128-GCM-SHA256(TLS 1.2)











