为什么最新的 JDK 更新后 Java 无法连接 MySQL 5.7?如何修复? (ssl.SSLHandshakeException:没有适当的协议)

2024-02-23

在 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其他线程中建议的文件是解决此问题的良好长期解决方案!


正如@skelwa 已经评论的那样,您需要添加enabledTLSProtocols=TLSv1.2连接字符串中的配置属性来解决您的问题。

完整的连接字符串连接器/J https://dev.mysql.com/doc/index-connectors.html可能看起来像这样:

jdbc:mysql://<host>:<port>/<dbname>?enabledTLSProtocols=TLSv1.2

For r2dbc https://r2dbc.io/你需要使用tlsVersion=TLSv1.2反而。

For 连接器/J v8.0.28 enabledTLSProtocols被重命名为tlsVersions (see note https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-using-ssl.html)。但是,原始名称仍保留为别名。


剩下的问题是:

为什么 JDK 和 MySQL 不同意使用TLSv1.2?

尽管双方实际上都支持 TLSv1.2,但您遇到的问题是由 Connector/J 的默认行为引起的。出于兼容性原因,Connector/J 默认情况下不启用 TLSv1.2 及更高版本。因此,必须明确启用它。

请参阅以下内容note https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-using-ssl.html:

对于连接到 MySQL 社区时的 Connector/J 8.0.18 及更早版本 使用 JDBC API 的服务器 5.6 和 5.7:由于兼容性问题 使用 yaSSL 编译的 MySQL Server,Connector/J 不启用 默认情况下使用 TLSv1.2 及更高版本的连接。当连接到 限制连接使用更高 TLS 版本的服务器, 通过设置 Connector/J 连接属性显式启用它们 enabledTLSProtocols(例如,设置 启用TLSProtocols = TLSv1,TLSv1.1,TLSv1.2)。


WARNING:请注意解决方案建议编辑jdk.tls.disabledAlgorithms代替jre/lib/security pose a 安全风险对您的应用程序进行更改并更改任何内容都可能会产生严重的影响! 这些协议被禁用是有原因的,人们不应该简单地删除该列表中的所有内容,甚至只是部分内容。


Note:如果您想从 JDK 获得更多底层信息来调试您的问题,您可以通过将以下配置传递给 java 命令来启用 ssl 调试日志:

-Djavax.net.debug=ssl,handshake甚至-Djavax.net.debug=all

在你的情况下,你会看到类似的东西:

...(HANDSHAKE_FAILURE): Couldn't kickstart handshaking (
"throwable" : {
  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)
    at java.base/sun.security.ssl.ClientHandshakeContext.<init>(ClientHandshakeContext.java:98)
    ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么最新的 JDK 更新后 Java 无法连接 MySQL 5.7?如何修复? (ssl.SSLHandshakeException:没有适当的协议) 的相关文章

随机推荐

  • \x1a 字符的含义是什么

    什么是 x1a字符的含义以及为什么mysql real escape string逃避吗 从文档中 mysql real escape string 调用 MySQL 的库函数 mysql real escape string 该函数在以下
  • 获取两个标题之间的差异

    我有这个方法来计算 2 个 0 360 罗盘方向之间的差异 尽管这可以计算出我的绝对偏差 例如 始终为正输出 有多远 但我无法弄清楚需要做什么才能将符号引入到输出中 理想情况下 如果从初始航向到最终航向的最短距离是顺时针旋转 我希望erro
  • 如何在rpart中应用权重?

    我有 Kaggle 实践竞赛中的房屋数据 我正在使用 rpart 训练一个简单的第一个模型来预测销售价格 该模型无法正确识别销售状况异常或预付款的销售 因此 我想增加这个在模型中显然被忽略的变量的重要性 我假设这是通过使用 权重 参数来完成
  • .ssh/config:Mac OS Sierra 10.12.6 上的“错误配置选项:UseKeychain”

    我正在尝试在 Mac Mac OS Sierra 10 12 6 上设置 ssh 配置 以便将 ssh 密钥的密码存储在钥匙串中 以前我可以这样做 ssh add K ssh id rsa 但最近这个方法似乎不再起作用了 下列的本文 htt
  • USB 传输数据

    我正在尝试通过 USB 发送和接收数据 我的设备 Acer Iconia A500 拥有连接到设备所需的一切 一切都很好并且工作正常 但是当我尝试发送和接收数据时 它的行为并不像预期的 这是我的代码 for this is the main
  • git pull --rebase 上游 master 污染了我的 Github PR diff

    在按照维护人员的要求更改 PR 之前 我会执行以下操作git pull rebase upstream master将我的提交置于代码库中其他新提交之上 然而 这似乎污染我的 PR 的差异 https github com pandas d
  • preg_match() 和用户名

    function isUserID username if preg match a z d 2 20 i username return true else return false 简单的 我有这个 你能解释一下它检查什么吗 我知道它会
  • 无法使用不安全的私钥通过 ssh 连接到 vagrant VM(vagrant 1.7.2)

    我有一个包含 3 个虚拟机的集群 这是 Vagrant 文件 mode ruby vi set ft ruby hosts host0 gt 192 168 33 10 host1 gt 192 168 33 11 host2 gt 192
  • 如何在 C 中创建 3 位变量作为数据类型? [复制]

    这个问题在这里已经有答案了 I can typedef char to CHAR1这是8位 但是如何将 3 位变量设置为数据类型呢 您可能想要执行类似于以下操作的操作 struct unsigned int fieldof3bits 3 n
  • CSS Hack 针对 Firefox 3.5+?

    Firefox 3 5 现在支持 nth 伪类 我用它来定位 Safari 和 Chrome 的 css 现在 Firefox 也会读取这些内容 从而导致轻微的布局问题 有谁知道专门针对 FF 3 5 的方法吗 BODY nth of ty
  • 如何使用 WordPress 点击播放 GIF(如 9GaG.com)?

    我需要在wordpress网站中实现这个 gif播放器 因为gif页面高达6mb 所以性能真的很糟糕 我读过这个Onclick 使用 jQuery 播放 GIF 图像并从头开始 https stackoverflow com questio
  • 如何删除 angular-ui-router URL 中的“#”符号

    我正在使用 angular ui router 库 但我遇到了 URL 问题 我有以下代码 app js app config function stateProvider urlRouterProvider stateProvider s
  • 根据 getDay 和 getHours + getMinutes 显示 div

    我正在为一家广播电台建立一个网站 并想显示当前正在播出的主持人 我构建了一个网络应用程序 其中包含演示者的数据 姓名 照片 个人简介以及每个工作日的开始 结束时间 div div class slot div div div 12 00 1
  • 以编程方式检查 DataBound CheckListBox

    我有一个 DataBound CheckedListBox 我需要检查上面的一些项目 我尝试使用以下代码 if string IsNullOrEmpty search Languages string langs search Langua
  • 如何避免 Raphael js 路径重叠

    我有一个基于 Raphael js 的流程图 它是一样的http raphaeljs com graffle html http raphaeljs com graffle html 然而 由于我有许多矩形拉斐尔盒子 并且我的线条路径是直线
  • Android 应用程序上的阿拉伯日期

    我正在开发 Android 应用程序 以及在应用程序上添加阿拉伯语的下一个版本 但我有一个问题 这个问题是 Android操作系统转换日期动态地为阿拉伯格式 我在 URL 参数中使用它 服务器无法读取它 如何将任何阿拉伯日期转换为英文日期
  • 打开 .git/config :权限被拒绝

    C Users Inspiron git config文件夹为空且命令 git config user email email protected cdn cgi l email protection返回错误 打开 git config 权
  • Android RecyclerView 适配器在单元测试中给出 null

    我正在尝试使用 AndroidJunit4 测试 RecyclerView 这是我的测试代码 package com kaushik myredmart ui all includes RunWith AndroidJUnit4 class
  • Symfony 序列化实体从输出中转义反斜杠

    您好 我正在为我的应用程序使用 Symfony2 我正在使用序列化器组件 encoder new JsonEncoder normalizer new GetSetMethodNormalizer callback function dat
  • 为什么最新的 JDK 更新后 Java 无法连接 MySQL 5.7?如何修复? (ssl.SSLHandshakeException:没有适当的协议)

    在 2021 年 4 月 JDK 的最新更新中 11 0 11 9 0ubuntu2 18 04 支持TLSv1 and TLSv1 1已被删除 大概是因为自 2021 年 3 月以来 这些版本不再受支持 这可以从差异中看出java sec