com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:不允许检索公钥

Posted

技术标签:

【中文标题】com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:不允许检索公钥【英文标题】:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Public Key Retrieval is not allowed 【发布时间】:2019-07-01 14:43:00 【问题描述】:

安装mysql8服务器并尝试连接后,我在java8上运行了一个spring boot项目,但出现错误

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Public Key Retrieval is not allowed.

最初我安装了 mysql5,它工作正常,但是当我安装 mysql8 服务器时,我收到错误 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Public Key Retrieval is not allowed.

我确实使用了&allowPublicKeyRetrieval=true,但它对我没有多大帮助。我只是无法继续进行并且无法连接到数据库。我也无法再次将 MySql 降级到 5。

我使用idea intelliJ 作为IDE。我还尝试添加以下依赖项:

<artifactId>mysql-connector-java</artifactId>
<version>8.0.14</version>

但是,这些解决方案都不起作用。

以下错误是我从 8.0.14 版本恢复 mysql-connector-java 时得到的,但是我得到了类似的 当我使用 8.0.14 版本时也出错。 即使更改为 MYSQL8InnoDBDialect,问题仍然存在。

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Public Key Retrieval is not allowed
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_181]
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_181]
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_181]
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_181]
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) ~[mysql-connector-java-5.1.47.jar:5.1.47]
        at com.mysql.jdbc.Util.getInstance(Util.java:408) ~[mysql-connector-java-5.1.47.jar:5.1.47]
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919) ~[mysql-connector-java-5.1.47.jar:5.1.47]
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:898) ~[mysql-connector-java-5.1.47.jar:5.1.47]
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:887) ~[mysql-connector-java-5.1.47.jar:5.1.47]
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:861) ~[mysql-connector-java-5.1.47.jar:5.1.47]
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:878) ~[mysql-connector-java-5.1.47.jar:5.1.47]
        at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:874) ~[mysql-connector-java-5.1.47.jar:5.1.47]
        at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1777) ~[mysql-connector-java-5.1.47.jar:5.1.47]
        at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1224) ~[mysql-connector-java-5.1.47.jar:5.1.47]
        at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2199) ~[mysql-connector-java-5.1.47.jar:5.1.47]
        at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2230) ~[mysql-connector-java-5.1.47.jar:5.1.47]

【问题讨论】:

我很确定allowPublicKeyRetrieval=true 应该可以工作。您能否向我们展示您的 application.properties(至少是您正在使用的 JDBC URL)。 #server.port=8090 ## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) spring.datasource.url = jdbc:mysql://localhost:3306/lms?useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL =false spring.datasource.username = root spring.datasource.password = ## Hibernate Properties # SQL 方言使 Hibernate 为所选数据库生成更好的 SQL spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect 您在 MySQL 8 中使用 MySQL 8 驱动程序,但您使用的是 MySQL5InnoDBDialect?这听起来不正确?另外,请将该信息编辑到问题本身中。在问题的底部,您应该会看到一个显示“编辑”的链接。 即使更改为 MYSQL8InnoDBDialect 后问题仍然存在。 你能显示你在使用 8.0.14 版本的 MySQL 连接器时得到的堆栈跟踪吗?您显示的堆栈跟踪是由旧版本的 MySQL 驱动程序生成的。 【参考方案1】:

您可以安装 HeidiSQL 等客户端应用程序来解决问题 要么 另一个选项是您应该将客户端选项添加到您的 mysql-connector allowPublicKeyRetrieval=true 以允许客户端自动从服务器请求公钥。请注意,AllowPublicKeyRetrieval=True 可能允许恶意代理执行 MITM 攻击以获取明文密码,因此默认为 False,必须显式启用。

您也可以在将它用于测试/开发目的时尝试添加 useSSL=false 就像下面这样:

jdbc:mysql://localhost:3306/db?allowPublicKeyRetrieval=true&useSSL=false

【讨论】:

以上是关于com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:不允许检索公钥的主要内容,如果未能解决你的问题,请参考以下文章

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:重复条目 '' 键 'PRIMARY'

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障?

错误 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:表不存在

使用 JDBC 访问远程 MySQL 数据库时出现 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障