连接Java-MySql:不允许公钥检索


104

我尝试使用连接器8.0.11将MySql数据库与Java连接。一切似乎都还可以,但是我有一个例外:

线程“主”中的异常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();
    }
}

1
请提供一些代码:您如何尝试连接。堆栈跟踪异常也会很有帮助。
谢尔盖·西里克

Answers:


228

您应该将客户端选项添加到mysql-connector中,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

好吧,这对我有用,但是我不确定从安全角度来看这些选项的合法性。
Priyank Thakkar

28
useSSL=false&allowPublicKeyRetrieval=true仅当我尝试从本地主机连接docker_container1到时才需要docker_container2_mysql(where mysql is installed)。从我的主机到docker_container2_mysqluseSSL=false就足够了。
prayagupd

1
allowPublicKeyRetrieval = true& useSSL = false,让它正常工作
Martin

2
您能解释为什么会这样吗?
Capn Sparrow

在昨天的Windows 10更新之后,向我的JDBC连接字符串添加'allowPublicKeyRetrieval = true'解决了我的开发系统的问题。猜猜微软堵塞了另一个漏洞,在我看来,未启用SSL的情况下,该选项应“仅用于开发”。
Alz

28

使用 jdbc url如:

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

PortNo: 3306 在您的配置中可以不同


这里有一个小修正。连接属性“ useSSL”可接受的值为:“ TRUE”,“ FALSE”,“ YES”或“ NO”。值'false;' 是不能接受的。
bluelurker

26

对于DBeaver用户:

  1. 右键单击您的连接,选择“编辑连接”

  2. 在“连接设置”屏幕(主屏幕)上,单击“编辑驱动程序设置”

  3. 点击“连接属性”

  4. 右键单击“用户属性”区域,然后选择“添加新属性”

  5. 添加两个属性:“ useSSL”和“ allowPublicKeyRetrieval”

  6. 通过双击“值”列将其值设置为“假”和“真”


10

除了建议的答案,您还可以尝试使用mysql_native_password身份验证插件代替caching_sha2_password身份验证插件。

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

4

我在Spring Boot框架上使用以下配置解决了这个问题

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

1

就我而言,这是用户错误。我使用的root用户密码无效。我不确定为什么我没有收到验证错误,而是收到了这个神秘的消息。


1

就我而言,上述错误实际上是由于用户名和密码错误造成的。解决问题:1.转至DriverManager.getConnection(“ jdbc:mysql:// localhost:3306 /?useSSL = false”,“ username”,“ password”)行;用户名和密码字段可能错误。输入用于启动mysql客户端的用户名和密码。用户名通常是root,密码是当类似这样的屏幕出现时,您输入的字符串

注意:端口名称3306可能与您的情况不同。


1

我发现这个问题很令人沮丧,因为昨天我可以与数据库进行交互,但是今天早上回来后,我开始出现此错误。

我尝试添加allowPublicKeyRetrieval=true标志,但一直出现错误。

对我来说,解决此问题的方法是Project->Clean在Eclipse和CleanTomcat服务器上进行。其中一个(或两个)修复了它。

我不明白为什么,因为我使用Maven构建项目,并且每次更改代码后都一直在重新启动服务器。很烦人...


1

在与MySQL的Spring Boot应用程序连接中更新useSSL = true;

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

1

在对我们现有的应用程序进行Docker处理时,我也面临着这样的问题。解决方案si为JDBC连接字符串添加了值为true的MySQL的allowPublicKeyRetrieval连接选项。如果这不起作用,请尝试将useSSL选项也添加到false

结果字符串如下所示:

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

0

该解决方案适用于MacOS Sierra,并运行MySQL 8.0.11版本。请确保已在构建路径中添加了驱动程序-“添加外部jar”应与SQL版本匹配。

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

0

将连接URL指定为jdbc:mysql:// localhost:3306 / hb_student_tracker?allowPublicKeyRetrieval = true&useSSL = false&serverTimezone = UTC


0

如果在连接mysql(运行mysql的本地或mysql容器)时遇到以下错误:

java.sql.SQLNonTransientConnectionException:不允许公共密钥检索

解决方案:在数据库服务中添加以下行:

command: --default-authentication-plugin=mysql_native_password

0

首先,请确保您的数据库服务器已启动并正在运行。在尝试了此处列出的所有答案之后,我遇到了同样的错误,我发现我的数据库服务器未运行。

您可以从MySQL Workbench或命令行使用以下命令进行检查

mysql -u USERNAME -p

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.