在 2021 年 4 月 JDK 的最新更新中(11.0.11+9-0ubuntu2~18.04
) 支持TLSv1
and TLSv1.1
已被删除,大概是因为自 2021 年 3 月以来,这些版本不再受支持。这可以从差异中看出java.security
file:
Before:
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, DH keySize < 1024, \
EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves
After:
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
这篇 SO 帖子中也讨论了这一点:SSLHandShakeException 没有适当的协议 https://stackoverflow.com/questions/38205947/sslhandshakeexception-no-appropriate-protocol。自 JDK 版本更新以来,最近几天该线程中也出现了更多答案。
更新JDK后,我们收到了错误
java.sql.SQLException: An attempt by a client to checkout a Connection has timed out.
with c3p0
.
切换到之后hikari
我们得到了一个更有意义的错误:
ERROR [2021-04-29 16:21:16,426] com.zaxxer.hikari.pool.HikariPool: HikariPool-1 - Exception during pool initialization.
! javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
我们在 MySQL 上运行5.7.33-0ubuntu0.18.04.1
。现在按照我的理解,如上所述here https://dev.mysql.com/doc/refman/5.7/en/encrypted-connection-protocols-ciphers.html,MySQL 5.7支持TLSv1.2。跑步的时候也有SHOW VARIABLES LIKE 'tls_version';
we get TLSv1,TLSv1.1,TLSv1.2
这表明TLSv1.2
是支持的。
那么问题来了,为什么 JDK 和 MySQL 不同意使用TLSv1.2
我们能做些什么来让他们与TLSv1.2
?
注意:我不认为改变java.security
其他线程中建议的文件是解决此问题的良好长期解决方案!