JDK-11 SSL握手异常:没有合适的协议(协议已禁用或密码套件不适当)

4

在使用jdk-11(Oracle 11.0.10)进行HTTPS连接时出现此错误。

javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
        at java.base/sun.security.ssl.HandshakeContext.<init>(HandshakeContext.java:170) ~[na:na]
        at java.base/sun.security.ssl.ClientHandshakeContext.<init>(ClientHandshakeContext.java:98) ~[na:na]
        at java.base/sun.security.ssl.TransportContext.kickstart(TransportContext.java:221) ~[na:na]
        at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:394) ~[na:na]
        at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:373) ~[na:na]
        at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:436) ~[httpclient-4.5.13.jar:4.5.13]
        at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:384) ~[httpclient-4.5.13.jar:4.5.13]
        at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142) ~[httpclient-4.5.13.jar:4.5.13]
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376) ~[httpclient-4.5.13.jar:4.5.13]

我尝试禁用或编辑 jdk.tls.disabledAlgorithms,但问题仍然存在。
我编辑的 java.security 位于 - C:\Program Files\Java\jdk-11.0.10\conf\security


你可以尝试升级到Java 14吗?这可能会在不需要任何配置或代码更改的情况下解决你的问题。 - Sari Alalem
我想使用Java 11,因为它是LTS版本。在Java 11中,我需要进行任何代码更改吗? - Vignesh Prasad V
Java 11 应支持所有现代 TLS 版本和密码。如果出现问题,您必须检查服务器支持哪些 TLS 版本和密码。您可以在 https://www.ssllabs.com/ssltest 上在线测试服务器,或通过脚本/程序 https://testssl.sh 测试私有/内部网络服务器。 - Robert
我在连接到 Google 通过 SMTP 时遇到了问题,这是由于更新 OpenJDK 11.0.10 到 11.0.11 导致的。 - davey
我已经尝试禁用或编辑——这并没有告诉我们你试图做什么。即使你这样做了,仍然缺少关键的信息 - 是什么触发了这个警报。转储该服务器端点的SSL信息(例如,他所做的:https://dev59.com/t-k5XIcBkEYKwwoY2NLu)(协议、支持的密码套件等)并将它们发布在问题中。并分享您尝试过的更改(disabledAlgorithms、./conf/security)。然后我们可以交流。 - netikras
1
@davey:11.0.11上的_mail_(SMTPS)与11.0.10上的HTTPS是不同的问题,并且在#67899129中由netikras提供了链接。 - dave_thompson_085
2个回答

1

这个异常是由于TLSv1和TLSv1.1被废弃所致。

从OpenJDK 8u292开始,11.0.11开始以及所有的OpenJDK 16版本在这里阅读, 所有的TLS连接都需要使用TLSv1.2或TLSv1.3版本。您只需设置Java系统属性即可将TLS版本设置为要使用的版本。

对于使用HttpsURLConnection的HTTPS连接:System.setProperty("https.protocols", "TLSv1.2");

对于SMTPS连接:System.setProperty("mail.smtp.ssl.protocols", "TLSv1.2");

对于POP3S连接:System.setProperty("mail.pop3s.ssl.protocols", "TLSv1.2");

请在客户端源代码之前使用上述命令。


1
默认禁用1(.0)和1.1是在11.0.11和16及以上版本,而不是此问题中的11.0.10。没有TLSv2或v3;SSLv3自8u31以来已被禁用,并且在任何Java中都从未实现过SSLv2。此外,sysprop https.protocols 控制 HttpsURLConnection,但不控制apache httpclient(通常情况下)。 - dave_thompson_085

0

我也遇到了Java 11.0.11的同样问题。请更新您的Java版本或使用之前的版本。对于我来说,使用OpenJDK版本"11.0.8"和AdoptOpenJDK运行环境(构建11.0.8+10)可以解决该问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接