在大型Java应用程序中,有没有办法确保只使用TLSv1.2或更高版本?

时间:2016-05-31 14:39:52

标签: java ssl https tls1.2

如果我正在开发一个包含许多开发人员的大型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跟踪到特定的服务器调用。

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]);
     }
    }