由于 Poodle 攻击,现在建议为客户端和服务器应用程序禁用 SSLv3,并且只允许 TLS 1.0 -TLS 1.2 连接。
有没有办法为计算机上所有基于 Java 的应用程序(服务器和客户端)禁用 SSLv3,而无需修改每个 Java 程序?
可能有可能更改 JRE 的配置或使用特殊的环境变量。
有人知道这样的方法吗?
由于 Poodle 攻击,现在建议为客户端和服务器应用程序禁用 SSLv3,并且只允许 TLS 1.0 -TLS 1.2 连接。
有没有办法为计算机上所有基于 Java 的应用程序(服务器和客户端)禁用 SSLv3,而无需修改每个 Java 程序?
可能有可能更改 JRE 的配置或使用特殊的环境变量。
有人知道这样的方法吗?
您没有指定 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
看看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 重新协商。
它解释了问题和修复。
您现在可以修补 Oracle Java。 http://www.oracle.com/technetwork/java/javase/documentation/cve-2014-3566-2342133.html
对于使用 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 连接。