![](/img/trans.png)
[英]NoSuchAlgorithmException in SSLContext.getInstance
[英]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()
返回 TLSv1.3 和 TLSv1.2,如果服務器端僅支持 TLSv1.2,則建立連接。
這出乎我的意料。 對我來說,這將是“算法降級”。
文檔只說“可能支持其他 SSL/TLS 版本”,所以當我指定“TLSv1.3”時,我不能指望回退到“TLSv1.2”有效,對嗎?
盡管看起來SSLContext.getInstance
參數是支持的最高 TLS 版本。
那么,如果服務器端可能支持 TLSv1.2 或 TSLv1.3 或兩者(並且沒有報告漏洞),那么實現 SSL 連接的正確方法是什么?
問候, 安德烈亞斯
您沒有說明您使用的是哪個漏洞檢查器,但報告與此相符:
假設是這樣,您還應該閱讀此聲納錯誤報告:
它表明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>
參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.