在大型 Java 应用程序中,有没有办法确保只使用 TLSv1.2 或更高版本?
In a large Java app, is there a way to ensure that only TLSv1.2 or above is used?
如果我正在与许多开发人员一起开发一个大型 Java 应用程序,并且在代码中有各种连接到 https 服务的方法,是否有一种相当简单的方法来强制他们都使用 TLS v1.2?
我已经尝试在测试应用中使用 -Dhttps.protocols=TLSv1.2
和 -Djdk.tls.client.protocols=TLSv1.2
,httpclient 很乐意使用 TLSv1 或 TLSv1.1。
或者,如果有一种直接的方法来记录 SSL 连接,使我能够弄清楚握手来自哪个调用,那也行得通,我可以在每个 gopher 出现时敲打它。不幸的是,启用 -Djavax.net.debug=ssl
只会向 STDOUT 输出大量信息,而且我没有简单的方法来跟踪给定的 *** ServerHello, TLSv1.1
到特定的服务器调用。
使用 Java8 TLSv1.2 默认启用,但 TLSv1 和 TLSv1.1 也可用。 限制出站连接使用 TLSv1.2 配置
jdk.tls.disabledAlgorithms= SSLv2Hello, SSLv3, TLSv1, TLSv1.1
在jre/lib/java.security
这将强制所有连接到 TLSv1.2,因此如果现有服务器不支持它,连接将失败。
使用下面的代码片段,您可以在不禁用的情况下进行检查
Supported Protocols: 5
SSLv2Hello
SSLv3
TLSv1
TLSv1.1
TLSv1.2
Enabled Protocols: 3
TLSv1
TLSv1.1
TLSv1.2
禁用算法
Supported Protocols: 5
SSLv2Hello
SSLv3
TLSv1
TLSv1.1
TLSv1.2
Enabled Protocols: 1
TLSv1.2
使用它来打印 SSL 上下文
private static void printSSLContext() throws IOException, NoSuchAlgorithmException, KeyManagementException{
SSLContext context = SSLContext.getInstance("TLSv1.2");
context.init(null,null,null);
SSLSocketFactory factory = (SSLSocketFactory)context.getSocketFactory();
SSLSocket socket = (SSLSocket)factory.createSocket();
String[] protocols = socket.getSupportedProtocols();
System.out.println("Supported Protocols: " + protocols.length);
for(int i = 0; i < protocols.length; i++) {
System.out.println(" " + protocols[i]);
}
protocols = socket.getEnabledProtocols();
System.out.println("Enabled Protocols: " + protocols.length);
for(int i = 0; i < protocols.length; i++) {
System.out.println(" " + protocols[i]);
}
String[] ciphers = socket.getSupportedCipherSuites();
System.out.println("Enabled Ciphers: " + ciphers.length);
for(int i = 0; i < ciphers.length; i++) {
System.out.println(" " + ciphers[i]);
}
}
如果我正在与许多开发人员一起开发一个大型 Java 应用程序,并且在代码中有各种连接到 https 服务的方法,是否有一种相当简单的方法来强制他们都使用 TLS v1.2?
我已经尝试在测试应用中使用 -Dhttps.protocols=TLSv1.2
和 -Djdk.tls.client.protocols=TLSv1.2
,httpclient 很乐意使用 TLSv1 或 TLSv1.1。
或者,如果有一种直接的方法来记录 SSL 连接,使我能够弄清楚握手来自哪个调用,那也行得通,我可以在每个 gopher 出现时敲打它。不幸的是,启用 -Djavax.net.debug=ssl
只会向 STDOUT 输出大量信息,而且我没有简单的方法来跟踪给定的 *** ServerHello, TLSv1.1
到特定的服务器调用。
使用 Java8 TLSv1.2 默认启用,但 TLSv1 和 TLSv1.1 也可用。 限制出站连接使用 TLSv1.2 配置
jdk.tls.disabledAlgorithms= SSLv2Hello, SSLv3, TLSv1, TLSv1.1
在jre/lib/java.security
这将强制所有连接到 TLSv1.2,因此如果现有服务器不支持它,连接将失败。
使用下面的代码片段,您可以在不禁用的情况下进行检查
Supported Protocols: 5
SSLv2Hello
SSLv3
TLSv1
TLSv1.1
TLSv1.2
Enabled Protocols: 3
TLSv1
TLSv1.1
TLSv1.2
禁用算法
Supported Protocols: 5
SSLv2Hello
SSLv3
TLSv1
TLSv1.1
TLSv1.2
Enabled Protocols: 1
TLSv1.2
使用它来打印 SSL 上下文
private static void printSSLContext() throws IOException, NoSuchAlgorithmException, KeyManagementException{
SSLContext context = SSLContext.getInstance("TLSv1.2");
context.init(null,null,null);
SSLSocketFactory factory = (SSLSocketFactory)context.getSocketFactory();
SSLSocket socket = (SSLSocket)factory.createSocket();
String[] protocols = socket.getSupportedProtocols();
System.out.println("Supported Protocols: " + protocols.length);
for(int i = 0; i < protocols.length; i++) {
System.out.println(" " + protocols[i]);
}
protocols = socket.getEnabledProtocols();
System.out.println("Enabled Protocols: " + protocols.length);
for(int i = 0; i < protocols.length; i++) {
System.out.println(" " + protocols[i]);
}
String[] ciphers = socket.getSupportedCipherSuites();
System.out.println("Enabled Ciphers: " + ciphers.length);
for(int i = 0; i < ciphers.length; i++) {
System.out.println(" " + ciphers[i]);
}
}