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

dan*_*nny 71 java mysql exception connector

我尝试使用连接器8.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)
Run Code Online (Sandbox Code Playgroud)

Connector Manager:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

jto*_*szk 144

您应该将客户机选项添加到您的mysql连接器 allowPublicKeyRetrieval=true

https://mysql-net.github.io/MySqlConnector/connection-options/

也可以帮助添加 useSSL=false

  • `useSSL = false&allowPublicKeyRetrieval = true`是我在本地主机中尝试从`docker_container1`连接到`docker_container2_mysql(其中安装了mysql)`时所需要的.从我的主机到`docker_container2_mysql`,`useSSL = false`就足够了. (16认同)
  • 尝试从对我有用的网址中删除 useSSl=false (5认同)
  • 嗯,这对我有用,但从安全角度来看,我不确定这些选项的合法性。 (3认同)
  • 我的问题是,直到昨天它都工作正常。一夜之间会发生什么改变? (3认同)
  • allowPublicKeyRetrieval=true&useSSL=false ,告诉你它有效 (2认同)
  • 你能解释为什么会这样吗? (2认同)
  • 我正在努力让“dbeaver”连接到*dockerized*“mysql-8”服务器。`allowPublicKeyRetrieval=true` 为我解决了这个问题:+1: (2认同)
  • @SandeepKumar 同样的事情也发生在我身上。你知道为什么吗?是的,我知道在你发表评论后已经过去了很多时间,所以我没有太高的期望:) (2认同)

Jav*_*les 130

对于DBeaver用户:

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

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

  3. 点击“连接属性”

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

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

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

  • 对我来说,只需将“驱动程序属性”下的“allowPublicKeyRetrieval”字段从 False 修改为 True 就可以了。请问为什么要添加“useSSL”属性然后将其设置为False?(我也在使用DBeaver) (8认同)
  • 在“驱动程序属性”部分/选项卡中设置这两个属性就足够了 (7认同)
  • 这是我使用 DBeaver 客户端时的正确答案 (3认同)
  • 就我而言,“allowPublicKeyRetrieval”属性仅接受“TRUE”(后者大写) (2认同)

mic*_*alk 33

DBeaver执行此操作时,我必须转到“连接设置”->“SSL”选项卡,然后:

  • 取消选中“验证服务器证书”
  • 勾选“允许公钥检索”

这是它的样子。 DBeaver 配置

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

  • 这就是最新版本的 DB Beaver 对我有用的方法 (2认同)

小智 23

当我遇到 root 帐户“不允许检索公钥”的问题时,我更新了此参数。

DBeaver更新该参数


sus*_*097 19

使用 jdbc url如:

jdbc:mysql://localhost:3306/Database_dbName?allowPublicKeyRetrieval=true&useSSL=false;
Run Code Online (Sandbox Code Playgroud)

PortNo: 3306 您的配置可能有所不同

  • 这里有一个小修正。连接属性“useSSL”可接受的值为:“TRUE”、“FALSE”、“YES”或“NO”。值“假”;是不能接受的。 (2认同)

小智 19

在此输入图像描述

打开DBeaver->编辑连接->查找驱动程序属性->allowPublicKeyRetrieval=trueuseSSl=true


Dam*_*ika 9

spring.datasource.url=jdbc:mysql://localhost:3306/database?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false
Run Code Online (Sandbox Code Playgroud)

您可以将此行插入到 applications.properties 文件中,这意味着,

  • spring.datasource.url=jdbc:mysql://localhost:3306/这个使用mysql作为数据库服务。我认为这可以通过使用相关名称和数据库名称的端口来更改。
  • database?createDatabaseIfNotExist=true= 使用名为database 的数据库,如果您还没有创建这样的数据库,请创建一个新数据库。
  • allowPublicKeyRetrieval=true= 允许客户端自动向服务器请求公钥。(这部分可能是额外的)
  • useSSL=false= 这将禁用 SSL 并抑制 SSL 错误

此外,请警惕spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect同一文件中的属性。

最后检查您是否在 pom.xml 文件的依赖项中添加了以下依赖项。

<dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.23</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)


小智 8

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

您可以从 MySQL Workbench 或命令行使用检查相同的内容

mysql -u USERNAME -p
Run Code Online (Sandbox Code Playgroud)

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


Tor*_*erv 7

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

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password_here'; 
Run Code Online (Sandbox Code Playgroud)


Has*_*anR 6

由于用户名或密码错误也可能发生这种情况。作为解决方案,我添加了 allowPublicKeyRetrieval=true&useSSL=false部分,但仍然出现错误,然后我检查了密码,结果是错误的。


Rav*_*avi 6

另一种方式,在 DBeaver 上。

您可以编辑数据库的连接,请转到连接设置中的 SSL 选项卡。有一个复选框“允许公钥检索”将其标记为 true。这样就能解决问题了


she*_*hub 5

我在 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
Run Code Online (Sandbox Code Playgroud)


Yos*_*eph 5

在 MySQL 8.0 中,默认身份验证插件从 mysql_native_password 更改为 caching_sha2_password。有关此更改的更多信息,请参阅https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password 。

这意味着为了使用 caching_sha2_password,连接必须执行以下操作之一:

您有几个选择:

  • 更改用户使用 mysql_native_password 插件(就像它历史上的做法一样,也适用于不支持 caching_sha2_password 的旧客户端/连接)
  • 使用SSL=true
  • useSSL=false 并配置公钥检索(这并不意味着使用 allowedPublicKeyRetrieval=true 可以避免错误 - 但违背了这种额外安全性的目标并且速度很慢 - 它确实意味着使用诸如 server-public-key-path 之类的东西指向公钥的客户端副本)