对于本机/APR/OpenSSL 连接器

对于本机/APR/OpenSSL 连接器

最近关于 SSL 的讨论BEAST 漏洞我想尝试提高基于 Tomcat 6 的 SSL 保护网站的安全性。为此,我尝试了谷歌的方法,即提供非密码块链接 (CBC)server.xml我的 Tomcat文件中的 HTTP 连接器声明中的密码优先级:

ciphers="TLS_ECDHE_RSA_WITH_RC4_128_SHA,
         TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,
         TLS_ECDH_RSA_WITH_RC4_128_SHA,
         TLS_ECDH_ECDSA_WITH_RC4_128_SHA,
         TLS_RSA_WITH_RC4_128_SHA,
         TLS_RSA_WITH_RC4_128_MD5,
         TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
         TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
         TLS_RSA_WITH_AES_256_CBC_SHA,
         TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
         TLS_RSA_WITH_3DES_EDE_CBC_SHA,
         TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
         TLS_RSA_WITH_AES_128_CBC_SHA"

但 Tomcat 似乎不使用密码的顺序,而是根据密钥强度选择最佳密码。此外SSL 实验室表示我的网站没有显示密码偏好,而 google.com 有。由于担心 SSL 不兼容,我不想删除 256 位 CBC 密码以使用 128 位 RC4 密码。我猜密码选择是在 Java JSSE 层而不是在 Tomcat 中完成的。

有谁知道使用标准 Tomcat HTTP 连接器自定义 SSL 密码优先级/顺序的简单方法吗?有没有办法使用简单的自定义 java 类来实现这一点?Tomcat APR 连接器和一些 openSSL 配置选项是否提供了替代方案。还有其他简单的方法可以做到这一点吗?

请注意,我意识到这种攻击需要跨站点脚本或其他类似的漏洞,因此并不那么严重(对我的网站而言)。但是,如果有简单的步骤可以缓解这种攻击,我会采取这些步骤。此外,我不想引入 Apache 前端(假设有办法在 Apache 中做到这一点),因为这会增加复杂性并因此带来风险。

答案1

我有同样的问题。看来我们无法做到我们想做的事。Sun
(Oracle)Java SSL 实现仅检查客户端密码套件顺序(优先级),而忽略服务器端。

相关类有:
sun.security.ssl.ServerHandshaker
sun.security.ssl.CipherSuite

在 ServerHandshaker 上,
“private void chooseCipherSuite(ClientHello mesg)”
http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-sun/security/sun/security/ssl/ServerHandshaker.java.htm

/*
 * Choose cipher suite from among those supported by client. Sets
 * the cipherSuite and keyExchange variables.
 */
private void chooseCipherSuite(ClientHello mesg) throws IOException {
    for (CipherSuite suite : mesg.getCipherSuites().collection()) {
        if (isEnabled(suite) == false) {
            continue;
        }
        if (doClientAuth == SSLEngineImpl.clauth_required) {
            if ((suite.keyExchange == K_DH_ANON) || (suite.keyExchange == K_ECDH_ANON)) {
                continue;
            }
        }
        if (trySetCipherSuite(suite) == false) {
            continue;
        }
        return;
    }
    fatalSE(Alerts.alert_handshake_failure,
                "no cipher suites in common");
}

我们可以看到它在客户端hello消息中迭代密码套件并选择密码套件。

答案2

对于本机/APR/OpenSSL 连接器

从 Tomcat 开始6.0.37/7.0.30/8.0.x,基于本机/APR/OpenSSL 的连接器支持SSLHonorCipherOrder配置设置允许服务器指定选择密码的顺序。该顺序由您决定,而不是基于“强度”等模糊定义,因为在某些情况下,高位密码可能比低位密码更糟糕。

对于基于 Java 的连接器(BIO、NIO、NIO2)

如果对于基于 Java 的连接器useServerCipherSuitesOrder将其设置为“true” (默认值),则 Java 8 及更高版本上的 Tomcat 8.0.21 及更高版本将使用服务器的首选密码套件顺序。

如果对于基于 Java 的连接器useServerCipherSuitesOrder将其设置为“true” (默认值),则 Java 8 及更高版本上的 Tomcat 7.0.60 及更高版本将使用服务器的首选密码套件顺序。

Tomcat 6 从未具备基于 Java 的连接器的此功能;Tomcat 6 上服务器首选的密码套件排序将需要使用 APR/native 连接器。

更新 2022-09-22

自从 2011 年首次提出关于在 Java 6、7 或 8 上运行 Tomcat 6 或 7 的问题以来,很多事情都发生了变化。Java 和 Tomcat 的所有合理最新版本都可以满足您的要求,只需阅读相应的文档即可。

答案3

在握手期间,客户端发送首选密码套件,服务器选择双方都支持的最强密码套件。
我不确定您期望的顺序是什么。

此外,SSL Labs 还指出我的网站没有显示密码偏好设置,而 google.com 则有

我不明白你的意思。
投诉到底是什么?在启用的密码中,Tomcat 选择的周数比它应该的少?

答案4

我不认为您可以根据偏好对它们进行排序,而且一旦您摆脱了 CBC,可用的密码选项列表就非常短了!但是,大多数客户端无论如何都会以 RC4-128 进行连接 - 至少当我想打开该日志记录选项时,我的所有服务器日志都显示这一点。

使用 OpenSSL 连接器,您可以选择使用更简洁的语法来允许或禁止某些密码,但没有设置密码顺序甚至首选密码的选项。

相关内容