7

由于 Poodle 攻击,现在建议为客户端和服务器应用程序禁用 SSLv3,并且只允许 TLS 1.0 -TLS 1.2 连接。

有没有办法为计算机上所有基于 Java 的应用程序(服务器和客户端)禁用 SSLv3,而无需修改每个 Java 程序?

可能有可能更改 JRE 的配置或使用特殊的环境变量。

有人知道这样的方法吗?

4

4 回答 4

3

您没有指定 Java 的版本,因为在 Java 8 以下没有办法禁止或禁用特定的 SSL 协议,但在 Java 8 中,您可以设置启用的协议,如下所示

静态:

% java -Djdk.tls.client.protocols="TLSv1,TLSv1.1,TLSv1.2" MyApp

动态:

java.lang.System.setProperty("jdk.tls.client.protocols", "TLSv1,TLSv1.1,TLSv1.2");

如果您仍在使用 java 7 或更低版本,请尝试使用解释说明在 Oracle JDK 和 JRE 中禁用 SSL v3.0 的解决方法

我刚刚在我们的一个 Java6 应用程序上实现了以下代码以禁止 SSLv3 和 SSLv2Hello。

if(disabledSSLProtocols != null) {

    String[] protocols = sslEngine.getEnabledProtocols();
    List<String> protocolList = new ArrayList<String>();

    for (String s : protocols) {

        if (disabledSSLProtocols.contains(s)) {

            log4j.info("{} protocol is disabled", s);
            continue;
        }

        log4j.info("{} protocol is enabled", s);
        protocolList.add(s);
    }

    sslEngine.setEnabledProtocols(protocolList.toArray(new String[0]));
}

在哪里disabledSSLProtocols初始化 SSLv3,SSLv2Hello

于 2015-01-27T02:30:11.220 回答
1

看看http://www.oracle.com/technetwork/java/javase/overview/tlsreadme-141115.html

相关部分:

可以通过在初始化 JSSE 库之前将新的系统属性 sun.security.ssl.allowUnsafeRenegotiation 设置为 true 来为需要它的应用程序重新启用重新协商。有几种方法可以设置此属性: 命令行:% java -Dsun.security.ssl.allowUnsafeRenegotiation=true 主 Java 控制面板(Java 插件/Java Web 启动)- 运行时环境。在应用程序内: java.lang.System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", true); 请注意,除非客户端和服务器都启用了重新协商,否则不会发生 TLS/SSL 重新协商。

它解释了问题和修复。

于 2014-10-22T09:54:01.487 回答
0

您现在可以修补 Oracle Java。 http://www.oracle.com/technetwork/java/javase/documentation/cve-2014-3566-2342133.html

于 2015-01-28T01:09:40.477 回答
0

对于使用 java.net-package 的 https 连接,您可以尝试使用 environment-variable_JAVA_OPTIONS来设置 system-property https.protocols

_JAVA_OPTIONS=-Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2

应该只启用提到的协议。请注意,在 Java 7 之前,支持的最高版本是 TLSv1。

此解决方案不会影响使用例如 apache-http-connector 的任何其他 SSL 连接或 http 连接。

于 2014-10-22T11:09:28.307 回答