我尝试使用Connector8.0.11将mysql数据库与java连接起来。一切似乎都很好,但我有一个例外:
线程“main”java.sql.sqlnontransientconnectionexception中出现异常:不允许检索公钥
堆栈跟踪:
Exception in thread "main" java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:108) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at
com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:862) at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:444) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:230) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:226) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:438) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:146) at com.mysql.cj.jdbc.MysqlDataSource.getConnection(MysqlDataSource.java:119) at ConnectionManager.getConnection(ConnectionManager.java:28) at Main.main(Main.java:8)
连接器管理器:
public class ConnectionManager {
public static final String serverTimeZone = "UTC";
public static final String serverName = "localhost";
public static final String databaseName ="biblioteka";
public static final int portNumber = 3306;
public static final String user = "anyroot";
public static final String password = "anyroot";
public static Connection getConnection() throws SQLException {
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUseSSL( false );
dataSource.setServerTimezone( serverTimeZone );
dataSource.setServerName( serverName );
dataSource.setDatabaseName( databaseName );
dataSource.setPortNumber( portNumber );
dataSource.setUser( user );
dataSource.setPassword( password );
return dataSource.getConnection();
}
}
16条答案
按热度按时间hgncfbus1#
您应该向mysql连接器添加client选项
allowPublicKeyRetrieval=true
允许客户端自动从服务器请求公钥。请注意AllowPublicKeyRetrieval=True
可能允许恶意代理执行mitm攻击以获取明文密码,因此默认情况下为false,必须显式启用。https://mysql-net.github.io/mysqlconnector/connection-options/
你也可以尝试添加
useSSL=false
当您将其用于测试/开发目的时例子:
hfsqlsce2#
对于dbeaver用户:
右键单击您的连接,选择“编辑连接”
在“连接设置”屏幕(主屏幕)上,单击“编辑驱动程序设置”
点击“连接属性”
右键单击“用户属性”区域并选择“添加新属性”
添加两个属性:“usessl”和“allowpublickeyretrieval”
通过双击“值”列将其值设置为“假”和“真”
wn9m85ua3#
使用
jdbc url
作为:wrrgggsh4#
除了建议的答案,您可以尝试使用mysql\u native\u password authentication plugin而不是缓存\u sha2\u password authentication plugin。
nnt7mjpx5#
从dbeaver执行此操作时,我必须转到“连接设置”->“ssl”选项卡,然后:
取消选中“验证服务器证书”
选中“允许公钥检索”
这就是它的样子。
请注意,这仅适用于本地开发。
ltqd579y6#
我在spring引导框架上使用下面的配置来解决这个问题
xt0899hw7#
这也可能是由于错误的用户名或密码。作为我补充的解决方案
allowPublicKeyRetrieval=true&useSSL=false
部分,但我还是得到了错误,然后我检查了密码,它是错误的。rt4zxlrg8#
在我的例子中,上述错误实际上是由于错误的用户名和密码。解决问题:1。转到line drivermanager.getconnection(“jdbc:mysql://localhost:3306/?usessl=false“,”用户名“,”密码“);用户名和密码字段可能错误。输入用于启动mysql客户端的用户名和密码。用户名通常是root,密码是当mysql的启动屏幕出现类似的屏幕时输入的字符串
注意:端口名3306在您的情况下可能不同。
6ojccjat9#
首先,请确保您的数据库服务器已启动并正在运行。我得到了相同的错误,在尝试了这里列出的所有答案后,我发现我的数据库服务器没有运行。
您可以从mysql工作台或命令行使用
这听起来很明显,但是很多时候我们假设数据库服务器一直在运行,特别是当我们在本地机器上工作时,当我们重新启动/关闭机器时,数据库服务器将自动关闭。
myss37ts10#
在我的情况下,这是用户错误。我用的是
root
密码无效的用户。我不知道为什么我没有得到一个身份验证错误,而是收到了这个神秘的消息。9avjhtql11#
我发现这个问题令人沮丧,因为我昨天能够与数据库交互,但今天早上回来后,我开始出现这个错误。
我试着添加
allowPublicKeyRetrieval=true
旗帜,但我一直得到错误。帮我修好的是
Project->Clean
在日 eclipse 和Clean
在我的tomcat服务器上。其中一个(或两个)修复了它。我不明白为什么,因为我用maven构建我的项目,并且在每次代码更改后都重新启动我的服务器。很烦人。。。
bq9c1y6612#
使用mysql更新spring-boot应用程序连接中的usessl=true;
mec1mxoz13#
我也面临这样一个问题,而停靠我们现有的应用程序。解决方案是在jdbc连接字符串中添加mysql的allowpublickeyretrieval连接选项,其值为true。如果这不起作用,也可以尝试将usessl选项添加到false。
结果字符串如下所示:
1mrurvl114#
此解决方案适用于macos sierra,并运行mysql版本8.0.11。请确保您在构建路径中添加的驱动程序-“addexternaljar”应该与sql版本匹配。
bprjcwpo15#
将连接url设为jdbc:mysql://localhost:3306/hb_student_tracker?allowpublickeyretrieval=true&usessl=false&servertimezone=utc