【问题标题】:In a large Java app, is there a way to ensure that only TLSv1.2 or above is used?在大型 Java 应用程序中,有没有办法确保只使用 TLSv1.2 或更高版本?
【发布时间】:2016-09-29 15:27:39
【问题描述】:

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

【问题讨论】:

    标签: java ssl https tls1.2


    【解决方案1】:

    对于 Java8,TLSv1.2 默认启用,但 TLSv1 和 TLSv1.1 也可用。 限制出站连接以使用 TLSv1.2 配置

     jdk.tls.disabledAlgorithms= SSLv2Hello, SSLv3, TLSv1, TLSv1.1
    

    jre/lib/java.security

    这将强制所有连接到 TLSv1.2,因此如果现有服务器不支持它,连接将失败。

    使用下面的 sn-p 可以在不禁用的情况下检查它

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

    【讨论】:

    • :-( 刚刚尝试过,但它仍然很高兴在 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 Test ... main, WRITE: TLSv1.1 Handshake, length = 161 main, READ: TLSv1.1 Handshake, length = 3801 *** ServerHello, TLSv1.1 ...
    • 您能否包含完整的握手日志?
    • 毫无疑问,它是 tlsv1.1,我找到了一个工作示例。看看吧
    • 所以我已经在使用 Java 8。创建 TLSv1.2 连接并不困难,但我想做的是(a)阻止应用程序中的任何人创建 TLSv1.1连接或 (b) 至少识别何时使用 TLVv1.1 或更早版本创建连接。
    • 是的,可以在您的服务器中将 TLSv1.2 配置为唯一接受的协议。所有服务器都有这个选项
    猜你喜欢
    • 1970-01-01
    • 2011-03-01
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多