SSLContext.getInstance("TLS") 漏洞

SSLContext.getInstance("TLS") vulnerability

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

我了解到自 2021 年 4 月起在 Java 实施中 TLSv1.1 和 TLSv1 无论如何都被禁用,但是当我尝试此修复时,我发现这将禁用 TLSv1.3(即使我添加通过 sslSocket.setEnabledProtocols(protocols)).

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

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

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

虽然看起来 SSLContext.getInstance 参数是支持的最高 TLS 版本。

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

此致, 安德烈亚斯

你没有说你使用的是哪个漏洞检查器,但报告是这样的:

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

SSLContext.getInstance(...) 中的参数不限制所使用的 TLS 版本。因此,漏洞报告是误报。随意使用不同的值使误报“消失”。但请注意,您并没有解决潜在/真正的漏洞。

正确限制用于特定连接的SSL/TLS版本,您可以配置SSLEngine对象:

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

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

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

参考: