如果我正在开发一个包含许多开发人员的大型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
跟踪到特定的服务器调用。
答案 0 :(得分:1)
使用Java8 TLSv1.2默认启用,但TLSv1和TLSv1.1也可用。 限制出站连接以使用TLSv1.2 configure
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
with disabledAlgorithm
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]);
}
}