目标主机支持RSA密钥交换 漏洞解决
在将 HTTP 协议切换为 HTTPS 过程中,我遇到了一个漏洞问题。以下是基于 Nginx 与 Java 配置 HTTPS 端口的解决方案。
验证
为验证某端口是否受 RSA 密钥交换漏洞影响,可在部署的 Linux 服务器上使用以下命令进行检测:
nmap --script ssl-enum-ciphers -p [端口号] [IP地址]
该命令将扫描指定 IP 和端口的 SSL/TLS 加密套件信息,从而判断是否存在使用 RSA 密钥交换的脆弱密码套件。具体结果可参考下图所示。

需要去除所有携带RSA的密码套件。
解决方法
一、基于LINUX解决
为了加固 HTTPS 端口的安全性并解决 RSA 密钥交换漏洞,在 Linux 环境下可通过优化 Nginx 配置来实现。以下是针对该问题的完整配置示例:
server {
listen [代理端口] ssl;
server_name [地址];
ssl_certificate [CRT];
ssl_certificate_key [KEY];
ssl_dhparam [PEM];
# 强化TLS设置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_session_tickets off; # 禁用会话票据
ssl_session_cache shared:SSL:10m; # 使用共享缓存
ssl_session_timeout 1h; # 延长会话超时时间
# 安全的密码套件,移除了DHE以提升性能,并使用ECDHE
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256';
ssl_ecdh_curve secp384r1; # 椭圆曲线选择
# 启用OCSP装订
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 valid=300s;
# 安全响应头
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Content-Security-Policy "default-src 'self'; frame-ancestors 'none';" always; # 内容安全策略
add_header X-Frame-Options "DENY" always; # 防止点击劫持
location / {
add_header X-Content-Type-Options "nosniff" always;
proxy_connect_timeout 1000s;
proxy_send_timeout 1000s;
proxy_read_timeout 10000s;
proxy_buffering off;
proxy_buffers 16 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 256k;
proxy_request_buffering off;
proxy_pass [原地址];
proxy_redirect default;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $server_port;
}
}
此配置不仅解决了RSA密钥交换漏洞,还增强了服务器的整体安全性。请根据实际情况调整证书路径、端口号及代理转发地址等参数。
二、基于JAVA解决
在创建 HTTPS 端口的代码中,添加如下代码以设置必要的系统属性:
System.setProperty("jdk.tls.namedGroups", "secp256r1,secp384r1,ffdhe2048");
此外,添加以下方法用于获取 HTTPS 所需的安全密码套件数组:
private String[] getSecureCipherSuites(SSLEngine engine) {
// 定义优先使用的一组安全密码套件(优先选择ECDHE算法)
List<String> secureCiphers = new ArrayList<>(Arrays.asList(
// 国际标准套件
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
// 国密标准套件(根据实际支持情况可进行调整)
"TLS_ECDHE_SM2_WITH_SM4_128_GCM_SM3",
"TLS_ECDHE_SM2_WITH_SM4_128_CBC_SM3",
// TLS 1.3 标准套件(默认具备前向保密)
"TLS_AES_128_GCM_SHA256",
"TLS_AES_256_GCM_SHA384"
));
// 过滤出 SSLEngine 实际支持的套件
List<String> enabledCiphers = new ArrayList<>();
for (String cipher : engine.getSupportedCipherSuites()) {
if (secureCiphers.contains(cipher)) {
enabledCiphers.add(cipher);
}
}
return enabledCiphers.toArray(new String[0]);
}
将上述方法返回的密码套件列表设置到 SSLEngine 中,代码如下:
engine.setEnabledCipherSuites(getSecureCipherSuites(engine));
同时,建议启用以下安全协议版本:
engine.setEnabledProtocols(new String[] { "TLSv1.3", "TLSv1.2" });
最后验证
最后,使用最初的验证命令检查是否仍存在使用 RSA 密钥交换的密码套件。若确认无 RSA 相关套件存在,则表示该漏洞已成功修复,结果如下图所示:

至此, 目标主机支持RSA密钥交换漏洞解决完成。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)