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