Linux

如何禁用 java.security 中的行以避免 javax.net.ssl.SSLHandshakeException?

  • February 11, 2022

我需要禁用java.security 文件(java 8 SE)中的以下行:

jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
  DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
  include jdk.disabled.namedCurves

在窗戶裡

Windows 中的圖像。

視窗路徑:Program Files\Java\jre1.8.0_301\lib\security\java.security

禁用這些行的目的是避免出現以下錯誤消息:

Error: javax.net.ssl.SSLHandshakeException: No appropriate protocol 
(protocol is disabled or cipher suites are inappropriate)

以及此處發布的解決方案提案(即對這些行發表評論)。

我不確定在行首 (#) 是否會禁用這兩個作業系統的註釋。因為這個oracle文件說是//

無論哪個用於註釋行,我也不知道是否有必要註釋掉所有 3 行,或者只是註釋掉第一行禁用所有 3。範例:

這邊走:

# jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
  DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
  include jdk.disabled.namedCurves

還是那樣?

# jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
#   DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
#   include jdk.disabled.namedCurves

問題:

如何在 Windows 和 Linux 上註釋掉(禁用)java.security文件中的前幾行以避免“錯誤:javax.net.ssl.SSLHandshakeException”,或者有人向我解釋是否有另一種解決方案,不同於已發布的解決方案

**是的,所有系統上的註釋字元都是#。**您連結的網頁是關於 SecurityManager 的安全策略文件(最初是為小程序設計的,現在很少使用);java.security 不是安全策略文件。

**是的,全部 3 行。**繼續語法(反斜杠-eol)僅適用於未註釋的行,因此要註釋在多(物理)行上連續的項目,請註釋每一行。

但是,由於您現在明確了協議上的錯誤,因此只刪除有問題的協議(幾乎可以肯定是 TLSv1(.0) 和/或 TLSv1.1 —— SSLv3 自 8u31 以來已被禁用)會更安全2015 年它被 POODLE 災難性地破壞後),剩下的就離開了。

您是否偶然嘗試使用舊版本的 javamail?有一段時間(錯誤)功能將安全模式預設為 TLSv1(.0)(僅)並在 8u291 和其他幾個版本出現時觸發此症狀;我們有幾個關於它的現有問題,只需搜尋“javamail 沒有適當的協議”。雖然刪除或減少 disabledAlgorithms 設置(或回歸到 8u291 以下)將允許客戶端嘗試TLS1.0 連接,但今天許多伺服器不會接受它,因為 TLS1.0 被認為已損壞;這就是為什麼Java 現在更改為預設禁用它的原因。在這種情況下,最好升級 javamail顯式配置mail.{smtp,imap,pop3}.ssl.protocols為可能適合今天的值TLSv1.2,TLSv1.3

(其他)替代方案:通常,您可以將系統屬性設置java.security.properties為每個/任何 JVM 分別指向不同(修改的)文件,例如使用-D命令行,而不是更改 JRE/lib/security/java.security 中影響所有 JVM 的內容,或者您可以Security.setProperty()在接近開頭的地方充分呼叫您的程式碼。

引用自:https://serverfault.com/questions/1093174