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:通信链路故障