我们会得到SSLContext.getInstance("TLS")
报告为漏洞的电话。推荐的修复方法是使用SSLContext.getInstance("TLSv1.2")
。
我了解到,自从2021年4月以来,在Java实现中一直禁用TLSv1.1和TLSv1,但是当我尝试这个修复时,我发现这将禁用TLSv1.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.2或TSLv1.3或者两者都支持(并且不报告漏洞),那么实现SSL连接的正确方法是什么?
你好,安德烈亚斯
发布于 2021-10-14 13:47:59
您没有说明您使用的是哪个漏洞检查器,但报告与以下内容相匹配:
如果是这样的话,您还应该阅读这个Sonar bug报告:
它指出,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>
参考资料:
https://stackoverflow.com/questions/69571364
复制相似问题