我需要在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()
在接近开头的地方调用您的代码。