连接java mysql:不允许公钥检索

u0njafvf  于 2021-06-21  发布在  Mysql
关注(0)|答案(16)|浏览(815)

我尝试使用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();
    }
}
0yycz8jy

0yycz8jy1#

如果在连接mysql(本地或运行mysql的mysql容器)时出现以下错误:
java.sql.sqlnontransientconnectionexception:不允许检索公钥
解决方案:在数据库服务中添加以下行:

command: --default-authentication-plugin=mysql_native_password
flseospp

flseospp2#

使用 jdbc url 作为:

jdbc:mysql://localhost:3306/Database_dbName?allowPublicKeyRetrieval=true&useSSL=false;
``` `PortNo: 3306` 你的配置可能不同
bqujaahr

bqujaahr3#

使用mysql更新spring-boot应用程序连接中的usessl=true;

jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC
pkwftd7m

pkwftd7m4#

对于dbeaver用户:
右键单击您的连接,选择“编辑连接”
在“连接设置”屏幕(主屏幕)上,单击“编辑驱动程序设置”
点击“连接属性”
右键单击“用户属性”区域并选择“添加新属性”
添加两个属性:“usessl”和“allowpublickeyretrieval”
通过双击“值”列将其值设置为“假”和“真”

gdrx4gfi

gdrx4gfi5#

我在spring引导框架上使用下面的配置来解决这个问题

spring.datasource.url=jdbc:mysql://localhost:3306/db-name?useUnicode=true&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
rjee0c15

rjee0c156#

从dbeaver执行此操作时,我必须转到“连接设置”->“ssl”选项卡,然后:
取消选中“验证服务器证书”
选中“允许公钥检索”
这就是它的样子。

请注意,这仅适用于本地开发。

c86crjj0

c86crjj07#

此解决方案适用于macos sierra,并运行mysql版本8.0.11。请确保您在构建路径中添加的驱动程序-“addexternaljar”应该与sql版本匹配。

String url = "jdbc:mysql://localhost:3306/syscharacterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
pn9klfpd

pn9klfpd8#

除了建议的答案,您可以尝试使用mysql\u native\u password authentication plugin而不是缓存\u sha2\u password authentication plugin。

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here';
xcitsw88

xcitsw889#

您应该向mysql连接器添加client选项 allowPublicKeyRetrieval=true 允许客户端自动从服务器请求公钥。请注意 AllowPublicKeyRetrieval=True 可能允许恶意代理执行mitm攻击以获取明文密码,因此默认情况下为false,必须显式启用。
https://mysql-net.github.io/mysqlconnector/connection-options/
你也可以尝试添加 useSSL=false 当您将其用于测试/开发目的时
例子:

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

qlvxas9a10#

我发现这个问题令人沮丧,因为我昨天能够与数据库交互,但今天早上回来后,我开始出现这个错误。
我试着添加 allowPublicKeyRetrieval=true 旗帜,但我一直得到错误。
帮我修好的是 Project->Clean 在日 eclipse 和 Clean 在我的tomcat服务器上。其中一个(或两个)修复了它。
我不明白为什么,因为我用maven构建我的项目,并且在每次代码更改后都重新启动我的服务器。很烦人。。。

juud5qan

juud5qan11#

这也可能是由于错误的用户名或密码。作为我补充的解决方案 allowPublicKeyRetrieval=true&useSSL=false 部分,但我还是得到了错误,然后我检查了密码,它是错误的。

yiytaume

yiytaume12#

在我的情况下,这是用户错误。我用的是 root 密码无效的用户。我不知道为什么我没有得到一个身份验证错误,而是收到了这个神秘的消息。

inkz8wg9

inkz8wg913#

我也面临这样一个问题,而停靠我们现有的应用程序。解决方案是在jdbc连接字符串中添加mysql的allowpublickeyretrieval连接选项,其值为true。如果这不起作用,也可以尝试将usessl选项添加到false。
结果字符串如下所示:

jdbc:mysql://<database server ip>:3306/databaseName?allowPublicKeyRetrieval=true&useSSL=false
3htmauhk

3htmauhk14#

首先,请确保您的数据库服务器已启动并正在运行。我得到了相同的错误,在尝试了这里列出的所有答案后,我发现我的数据库服务器没有运行。
您可以从mysql工作台或命令行使用

mysql -u USERNAME -p

这听起来很明显,但是很多时候我们假设数据库服务器一直在运行,特别是当我们在本地机器上工作时,当我们重新启动/关闭机器时,数据库服务器将自动关闭。

qcuzuvrc

qcuzuvrc15#

在我的例子中,上述错误实际上是由于错误的用户名和密码。解决问题:1。转到line drivermanager.getconnection(“jdbc:mysql://localhost:3306/?usessl=false“,”用户名“,”密码“);用户名和密码字段可能错误。输入用于启动mysql客户端的用户名和密码。用户名通常是root,密码是当mysql的启动屏幕出现类似的屏幕时输入的字符串
注意:端口名3306在您的情况下可能不同。

相关问题