nginx 不存在 $ssl_cipher_export 变量;出口级加密套件(如 exp-rc4-md5)属历史遗留弱算法,现代 openssl 和 nginx 默认禁用,应通过 ssl_ciphers 显式排除 !export、!rc4、!des 等,并配合 ssl_prefer_server_ciphers on 和日志记录 $ssl_cipher 验证实际协商结果。

实际上,Nginx 并没有 $ssl_cipher_export 这个变量,它并不存在于任何官方文档或源码中。你可能混淆了历史遗留概念——“出口级加密”(export cipher suites)是上世纪 90 年代美国对加密技术出口管制的产物,对应的是强度极低(如 40 位或 56 位密钥)的密码套件,例如 EXP-RC4-MD5、EXP-DES-CBC-SHA 等。现代 Nginx 不提供专门标识“是否为 export 套件”的内置变量,但可以通过其他方式识别并拦截这类弱加密流量。
确认当前启用的密码套件是否含 export 类型
Nginx 本身自 1.11.0+ 版本起已默认禁用所有 export 密码套件;OpenSSL 1.0.2e+ 及后续版本也移除了对 export 套件的支持。因此,真实环境中几乎不可能协商出 export 级加密。若需验证:
- 运行
openssl ciphers -v 'ALL:COMPLEMENTOFDEFAULT' | grep EXP,检查输出是否为空 —— 现代 OpenSSL 通常不返回任何含EXP的条目 - 在 Nginx 配置中显式禁用:
ssl_ciphers "HIGH:!aNULL:!MD5:!EXPORT:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2:!SSLv3";(其中!EXPORT是关键)
用 $ssl_cipher 判断并拒绝弱加密连接
虽然没有 $ssl_cipher_export,但可通过 $ssl_cipher 获取协商后的具体套件名称,并结合 map 指令匹配已知弱套件(包括历史 export 套件及其它不安全组合):
map $ssl_cipher $is_weak_cipher {
default 0;
~*EXP 1; # 匹配含 EXP 的套件名
~*NULL 1; # 无加密套件
~*ADH 1; # 匿名 DH,无认证
~*EXPORT 1;
~*DES 1; # 单 DES,已淘汰
~*RC4 1; # 已被证实不安全
}
然后在 server 块中拦截:
if ($is_weak_cipher) {
return 444; # 直接关闭连接(Nginx 特有,无声断连)
}
⚠️ 注意:if 在 location 外使用有风险,更稳妥做法是放在 ssl_preread 阶段(需 stream 模块 + OpenSSL 1.1.1+),或在应用层(如后端服务)校验 $ssl_cipher 后返回 403。
启用 ssl_ciphers 白名单,从源头杜绝弱协商
最有效的方式不是事后过滤,而是前置限制可协商的密码套件范围:
- 推荐配置(兼容性与安全性平衡):
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; - 强制仅用前向保密(PFS)套件,排除所有静态 RSA 密钥交换
- 配合
ssl_prefer_server_ciphers on;,确保服务端优先选择最强套件
验证实际协商结果是否符合预期
部署后务必测试:
- 用
openssl s_client -connect yoursite.com:443 -cipher EXPORT尝试强制指定 export 套件,应失败(Connection refused 或 handshake failure) - 访问 SSL Labs Test,查看 “Handshake Simulation” 中各客户端协商出的 Cipher Suite 是否全部不含 EXP/RC4/DES/NULL
- 开启 Nginx 日志记录
$ssl_cipher,抽样检查 access.log,确认无异常套件出现
不复杂但容易忽略:真正的安全防线在于初始密码套件策略,而非依赖某个虚构变量做运行时过滤。现代 TLS 部署中,export 套件已是考古对象,重点应转向禁用 RC4、SHA1、TLS 1.0/1.1 及非前向保密算法。











