【发布时间】:2014-10-22 09:46:08
【问题描述】:
由于受到 Poodle 攻击,现在建议为客户端和服务器应用程序禁用 SSLv3,并且只允许 TLS 1.0 -TLS 1.2 连接。
有没有一种方法可以为计算机上所有基于 Java 的应用程序(服务器和客户端)禁用 SSLv3,而无需修改每个 Java 程序?
可能会更改 JRE 的配置或使用特殊的环境变量。
有人知道这种方法吗?
【问题讨论】:
标签: java poodle-attack
由于受到 Poodle 攻击,现在建议为客户端和服务器应用程序禁用 SSLv3,并且只允许 TLS 1.0 -TLS 1.2 连接。
有没有一种方法可以为计算机上所有基于 Java 的应用程序(服务器和客户端)禁用 SSLv3,而无需修改每个 Java 程序?
可能会更改 JRE 的配置或使用特殊的环境变量。
有人知道这种方法吗?
【问题讨论】:
标签: java poodle-attack
您没有指定 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
【讨论】:
看看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 重新协商。
它解释了问题和解决方法。
【讨论】:
对于使用 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。
【讨论】:
【讨论】: