Diffie-Hellman密钥交换的安全性依赖有限域上计算离散对数的困难性。Logjam攻击没有推翻这个数学难题,而是通过协议降级把难题缩小到可以预先计算的范围。理解这一点,需要先查看TLS握手中DHE套件的协商过程。客户端发送ClientHello声明支持的密码套件,服务器用ServerHello选定一套,随后在ServerKeyExchange中发送DH参数。正常情况下服务器会选择2048位或更高强度的参数,但如果双方都支持DHE_EXPORT这类导出级套件,中间人可以拦截并替换协商内容,把参数强度拉低到512位。攻击者如果能事先针对常见的512位素数完成离散对数预计算,就可以在握手进行中恢复出服务器临时私钥。

一、Logjam攻击为什么依赖导出级密码套件
导出级密码套件诞生于20世纪90年代美国加密出口管制时期,为了满足法律限制,软件只能使用512位以下的RSA或DH参数。TLS协议保留了这些套件以便向后兼容。DHE_EXPORT套件在设计时允许服务器在ServerKeyExchange中发送小于等于512位的临时DH参数,即使客户端声明支持更强的DHE套件,攻击者也可以把协商结果改成DHE_EXPORT。
从数学角度看,Diffie-Hellman交换的核心是两个值g^a mod p与g^b mod p,安全性取决于从公开值推导出私有指数a或b的离散对数代价。当p是512位素数时,现代计算集群可以在较短时间内完成针对该素数的离散对数预计算。Logjam研究团队指出,针对一个广泛使用的512位素数的预计算大约需要一周的高性能计算时间,但如果多个服务共享同一个素数,一次预计算即可用于所有经过降级的连接。
这里的关键不是单个破解时间,而是复用性。大量主流服务器在2015年之前使用了同样的默认DH参数文件,攻击者只需要攻破这一组参数就能同时影响大量TLS会话。中间人攻击者可以在见到ClientHello后立即发起降级,同时利用已经准备好的离散对数表,在握手完成前恢复密钥并继续伪装通信。
二、攻击步骤拆解:从握手篡改到会话解密
Logjam攻击的典型流程分为五个阶段。第一阶段,中间人监听客户端发出的ClientHello,记录其中支持的DHE与DHE_EXPORT套件列表。第二阶段,攻击者构造一个只包含DHE_EXPORT的ClientHello替代原报文,转发给服务器,迫使服务器选择导出级套件。第三阶段,服务器生成512位DH参数并在ServerKeyExchange中返回,攻击者原样转发给客户端。第四阶段,客户端收到后并不会检查参数长度是否安全,因为它认为这就是服务器选择的套件,于是使用弱参数完成密钥交换。第五阶段,攻击者利用预计算好的离散对数结果恢复服务器私钥,并计算出主密钥,之后即可解密或篡改加密流量。
从实现层面看,这一攻击利用了TLS握手中两个容易被忽视的缺陷:客户端无法验证服务器是否原本支持更强参数,服务器也无法确认客户端是否真的只接受导出级套件。握手协议在密码套件协商过程中缺乏对面身份的端到端完整性保护,给中间人篡改提供了空间。
下面用一个简化的bash命令验证服务器是否仍然支持导出级DHE套件。现代OpenSSL版本通常已经默认禁用这些套件,但旧版本或错误配置的服务器仍可能响应。
openssl s_client -connect ipipp.com:443 -cipher EXPORT
如果命令返回中包含Cipher is ... EXPORT-...,说明服务器存在被降级攻击的风险。实际测试时需要替换为真实的目标主机名。
三、服务器端配置加固:禁用降级并提升DH强度
针对Logjam攻击,第一步是彻底移除导出级和弱加密套件。Apache可以使用SSLCipherSuite指令显式列出安全套件,并排除EXPORT、LOW、NULL。Nginx则通过ssl_ciphers完成类似设置。配置完成后需要重新加载服务并重启相关进程,不能只修改配置文件而不生效。
第二步是为DHE临时密钥提供足够长度。OpenSSL生成DH参数时,至少应该使用2048位,理想情况下使用与RSA或ECC证书相同强度的参数。Nginx需要把生成的参数文件路径配置到ssl_dhparam指令,Apache在2.4.7及更高版本中可以用SSLOpenSSLConfCmd DHParameters指定。如果不指定,某些版本会使用内置的1024位默认参数,这同样不安全。
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5:!EXPORT:!LOW; ssl_prefer_server_ciphers on; ssl_dhparam /etc/nginx/dhparams.pem;
openssl dhparam -out /etc/nginx/dhparams.pem 2048
上述Nginx配置中,ssl_ciphers使用!EXPORT明确排除导出级套件,ssl_protocols限制在TLS1.2及以上版本。ssl_dhparam指向预先生成的2048位参数文件。Apache用户也可以使用类似的排除语法,在SSLCipherSuite后面追加!EXPORT。
四、检测与长期防护策略
要确认线上服务是否受Logjam影响,可以使用nmap的ssl-enum-ciphers脚本枚举服务器实际支持的密码套件,并检查其中是否存在DHE_EXPORT或512位参数。另一个方法是使用openssl s_client命令指定-cipher EXPORT并观察握手结果。无论采用哪种工具,都应该在多个网络位置进行测试,因为中间设备或负载均衡器也可能改变最终协商结果。
nmap --script ssl-enum-ciphers -p 443 ipipp.com
长期来看,协议层面的改进同样重要。TLS 1.3直接移除了DHE_EXPORT等导出级套件,同时为DHE强制要求至少2048位参数,并推荐使用X25519或P-256等椭圆曲线方案。即使仍在使用TLS 1.2,也应该优先启用ECDHE套件,因为椭圆曲线离散对数在相同安全强度下参数更短、计算更快,而且不像传统DHE那样容易受到共享参数预计算攻击。
客户端方面也需要保持更新。主流浏览器自2015年起陆续发布补丁,拒绝与使用弱DH参数的服务器完成握手。这意味着即使用户访问的服务器存在配置问题,新版本浏览器也会主动中断连接,从而降低被动解密和篡改风险。对于企业内部使用自签名证书或旧版中间件的系统,维护人员应额外注意DH参数是否统一采用了安全长度,并定期复查密码套件白名单。
Logjam攻击最终被遏制,靠的不是单一补丁,而是客户端、服务器、协议规范三方的共同修正。这也提醒运维人员,安全配置不能只处理证书和算法名称,临时参数生成方式与密钥长度同样决定整个会话是否可信。
Logjam攻击Diffie-Hellman密钥交换修改时间:2026-08-19 08:20:03