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

在大型Java应用程序中,是否有办法确保只使用TLSv1.2或更高版本?,java,ssl,https,tls1.2,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连接,让我能够找出握手来自哪个呼叫,那就行了,我可以在每次出现时敲打每只地鼠。不幸的是,

如果我与许多开发人员一起开发一个大型Java应用程序,并且在代码中有各种连接https服务的方法,那么有没有一种相当简单的方法来强制执行它们都使用TLS v1.2

我已经尝试在测试应用程序中使用
-Dhttps.protocols=TLSv1.2
-Djdk.tls.client.protocols=TLSv1.2
,httpclient很乐意使用TLSv1或TLSv1.1


或者,如果有一种简单的方法来记录SSL连接,让我能够找出握手来自哪个呼叫,那就行了,我可以在每次出现时敲打每只地鼠。不幸的是,启用
-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]);
     }
    }
private static void printSSLContext()引发IOException、NoSuchAlgorithmException、KeyManagementException{
SSLContext context=SSLContext.getInstance(“TLSv1.2”);
init(null,null,null);
SSLSocketFactory=(SSLSocketFactory)context.getSocketFactory();
SSLSocket套接字=(SSLSocket)工厂。createSocket();
String[]protocols=socket.getSupportedProtocols();
System.out.println(“支持的协议:“+协议.长度”);
for(int i=0;i
:-(刚刚尝试过,但它仍然很高兴地在SSL调试的基础上打印出来:
$java-Ddeployment.security.SSLv2Hello=false-Ddeployment.security.SSLv3=false-Ddeployment.security.TLSv1=false-Ddeployment.security.TLSv1.1=false-Ddeployment.security.TLSv1.2=true-Djavax.net.debug=SSL测试…main,WRITE:TLSv1.1.1握手,length=161 main,READ:TLSv1.1握手,长度=3801***服务器您好,TLSv1.1…
您能提供完整的握手日志吗?毫无疑问,它是TLSv1.1,我找到了一个工作示例。检查一下,因为我已经使用Java 8了。创建TLSv1.2连接并不困难,但我想做的是(a)阻止应用程序中的任何人创建TLSv1.1连接,或(b)至少标识何时使用TLVv1.1或更早版本创建连接。是的,可以在服务器TLSv1.2中配置为唯一接受的协议。所有服务器都有此选项