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

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

我需要在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 中的图像。

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

问题:

如何注释掉(禁用)前面几行java.security在 Windows 和 Linux 上编辑文件以避免出现“错误:javax.net.ssl.SSLHandshakeException”,或者有人向我解释是否有其他解决方案,不同于已发布的解决方案

答案1

是的,在所有系统上注释字符都是#。您链接的网页是关于安全策略文件的,针对 SecurityManager(最初为小程序设计,现在很少使用);java.security 不是安全策略文件。

是的,全部 3 行都做。连续语法 (反斜杠-eol) 仅适用于未注释的行,因此要注释跨多行(物理)行延续的项目,请注释每一行。

但是,既然你现在明确指出错误出在协议上,只删除有问题的协议会更安全(几乎可以肯定是 TLSv1(.0) 和/或 TLSv1.1 - SSLv3 在被 POODLE 灾难性地破坏后,自 2015 年 8u31 以来就已被禁用)并保留其余部分。

您是否尝试使用旧版本的 javamail?有一段时间,有一个(错误)功能将安全模式默认为 TLSv1(.0)(仅),并在 8u291 和其他几个版本发布时触发此症状;我们有几个关于它的现有问题,只需搜索“javamail 没有适当的协议”。虽然删除或减少 disabledAlgorithms 设置(或降级到 8u291 以下)将允许客户端试图TLS1.0 连接,目前许多服务器不会接受它,因为 TLS1.0 被认为是有问题的;这是为什么Java 现已更改为默认禁用它。在这种情况下,最好升级 javamail或者明确地配置mail.{smtp,imap,pop3}.ssl.protocols为今天可能合适的值TLSv1.2,TLSv1.3

(其他)替代方案:一般来说,您不需要更改影响所有 JVM 的 JRE/lib/security/java.security 中的内容,而是可以将系统属性设置java.security.properties为为每个/任何 JVM 分别指向不同的(已修改的)文件,例如使用-D命令行,或者您可以Security.setProperty()在接近开头的地方调用您的代码。

相关内容