有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSSLContext。getInstance(“TLS”)漏洞

我们将调用SSLContext.getInstance("TLS")报告为漏洞。建议的修复方法是使用SSLContext.getInstance("TLSv1.2")

我知道TLSv1。1和TLSV1从2021年4月开始在java实现中被禁用,但是当我尝试了这个修复时,我发现这将禁用TLVS1。3(即使我通过sslSocket.setEnabledProtocols(protocols)添加它)

当我使用SSLContext.getInstance("TLSv1.3")时,sslSocket.getEnabledProtocols()返回两个TLSv1。3和TLSv1。2,如果服务器端仅支持TLSv1。2、建立连接

这对我来说是出乎意料的。对我来说,这将是一次“算法降级”

文档中说只有“可能支持其他SSL/TLS版本”,所以当我指定“TLSv1.3”时,我不能期望回退到“TLSv1.2”会起作用,对吗

尽管看起来SSLContext.getInstance参数是受支持的最高TLS版本

那么,如果服务器端可能支持TLSv1,那么实现SSL连接的正确方法是什么呢。2或TSLv1。3或两者都有(且未报告漏洞)

问候,, 安德烈亚斯


共 (1) 个答案

  1. # 1 楼答案

    您没有说明正在使用哪个漏洞检查器,但报告与此匹配:

    假设是这样,您还应该阅读此声纳错误报告:

    它指出SSLContext.getInstance(...)中的参数不约束所使用的TLS版本。因此,漏洞报告为假阳性。请随意使用不同的值使假阳性“消失”。但请注意,您没有解决潜在/真实的漏洞

    要正确地约束用于特定连接的SSL/TLS版本,可以配置SSLEngine对象:

    serverEngine = serverSslContext.createSSLEngine();
    serverEngine.setEnabledProtocols(new String[] { "TLSv1.2", "TLSv1.3" });
    

    或者,您可以通过在命令行上设置JVM属性来在整个JVM范围内约束此JVM:

    java -Dhttps.protocols="TLSv1.2,TLSv1.3" \
         -Djdk.tls.client.protocols="TLSv1.2,TLSv1.3" <MyApp>
    

    参考: