【问题标题】:Is it possible to disable SSLv3 for all Java applications?是否可以对所有 Java 应用程序禁用 SSLv3?
【发布时间】:2014-10-22 09:46:08
【问题描述】:

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

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

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

有人知道这种方法吗?

【问题讨论】:

标签: java poodle-attack


【解决方案1】:

您没有指定 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 或更低版本,请尝试使用解决方法解释 Instructions to disable SSL v3.0 in Oracle JDK and JRE

我刚刚在我们的一个 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

【讨论】:

  • 这只会影响 Java 客户端。检查here
【解决方案2】:

看看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 Start)- 运行时环境。 在应用程序内: java.lang.System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", true); 请注意,除非客户端和服务器都启用了重新协商,否则不会发生 TLS/SSL 重新协商。

它解释了问题和解决方法。

【讨论】:

  • 您确定 unsafe-renegotiation 与 poodle-attck 相关吗?
  • 是的,非常如此。该攻击之所以有效,是因为它可以强制使用较低的协议(SSL3 而不是 TLS)。通过禁用重新协商,您可以禁用攻击,
  • 回退机制和重新协商是不同的。回退将尝试使用最新的协议创建连接,如果失败则尝试较新的协议。重新协商是在连接成功后改变ssl连接。
【解决方案3】:

对于使用 java.net-package 的 https 连接,您可以尝试使用环境变量 _JAVA_OPTIONS 来设置系统属性 https.protocols

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

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

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

【讨论】:

  • 这只会影响 Java 客户端。检查here
【解决方案4】:
猜你喜欢
  • 2011-05-01
  • 2019-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多