我們將呼叫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 連接的正確方法是什么?
問候, 安德烈亞斯
uj5u.com熱心網友回復:
您沒有說明您使用的是哪個漏洞檢查器,但報告與此相符:
- 不應使用弱 SSL/TLS 協議 - RSPEC-4423
假設是這樣,您還應該閱讀此聲納錯誤報告:
- 使用 Java 的 SSLContext 的沖突規則
它表明 aSSLContext.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>
參考:
- 在 Oracle JDK 和 JRE 中禁用 SSL v3.0 的說明
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/318554.html
