在将 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密钥交换漏洞解决完成。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐