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

时间:2018-05-16 21:02:19

标签: 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)

连接器管理器:

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();
    }
}

18 个答案:

答案 0 :(得分:98)

您应该将客户端选项添加到mysql-connector free(sum_result);

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

还有助于添加allowPublicKeyRetrieval=true

答案 1 :(得分:48)

对于 DBeaver 用户:

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

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

  3. 单击“连接属性”

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

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

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

答案 2 :(得分:11)

jdbc url用作:

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

PortNo: 3306的配置可能不同

答案 3 :(得分:4)

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

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

答案 4 :(得分:2)

我在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

答案 5 :(得分:2)

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

答案 6 :(得分:1)

就我而言,这是用户错误。我使用的// The red circle is the figure to drop into a raft var circle = new draw2d.shape.basic.Circle({radius: 40, x: 50, y: 150}); // The blue rectangle is a simple raft var raft = new draw2d.shape.composite.Raft({width: 200, height: 150, x: 250, y: 20, bgColor:"#0074d9"}); // The orange rectangle is an embedded raft in a FlexGridLayout var flexLayout = new draw2d.shape.layout.FlexGridLayout({width: 200, height: 200, x: 250, y: 250, stroke: 1, columns: "grow", rows: "5px, grow"}); var label = new draw2d.shape.basic.Label({text: "a label", resizeable: true}); var embeddedRaft = new draw2d.shape.composite.Raft({width: 200, height: 150, x: 250, y: 150, bgColor:"#FF851B"}); flexLayout.add(label, {row: 0, col: 0}); flexLayout.add(embeddedRaft, {row: 1, col: 0}); 用户使用了无效的密码。我不确定为什么我没有收到验证错误,而是收到了这个隐秘的消息。

答案 7 :(得分:1)

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

您可以使用

从MySQL Workbench或命令行中进行检查。
using DevExpress.XtraReports.UI;
using System;
using System.Collections.Generic;

namespace TestRepo.ReportsDesign
{
    public class ReportFactory
    {
        static ReportFactory()
        {
            Report.Add("Zaposleni 1", () => new ZaposleniSaoOsig1());
            Report.Add("Zaposleni 2", () => new ZaposleniSaoOsig2());
            Report.Add("Zaposleni 3", () => new ZaposleniSaoOsig3());
        }

        public static Dictionary<string, Func<XtraReport>> Report = new Dictionary<string, Func<XtraReport>>();
    }
}

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

答案 8 :(得分:1)

在对我们现有的应用程序进行泊坞窗处理时,我也遇到了这样的问题。该解决方案可以在JDBC连接字符串中添加值为 true 的MySQL的 allowPublicKeyRetrieval 连接选项。 如果这不起作用,请尝试向 false 中添加 useSSL 选项。

结果字符串如下所示:

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

答案 9 :(得分:0)

我的问题出在 pom.xml (spring boot)。 我的 pom.xml 有两个不同数据库的依赖项。确保仅保留 MySQL 依赖项并删除任何其他数据库依赖项。

答案 10 :(得分:0)


<块引用>

Server Time Zone 设置为我的本地位置,解决了问题。


ServerTimeZone

答案 11 :(得分:0)

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

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

这是它的外观。 DBeaver configuration

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

答案 12 :(得分:0)

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

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

答案 13 :(得分:0)

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

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

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

command: --default-authentication-plugin=mysql_native_password

答案 14 :(得分:0)

将连接网址设置为 jdbc:mysql:// localhost:3306 / hb_student_tracker?allowPublicKeyRetrieval = true&useSSL = false&serverTimezone = UTC

答案 15 :(得分:0)

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

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

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

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

答案 16 :(得分:0)

在我看来,上述错误实际上是由于用户名和密码错误造成的。 解决问题: 1.转到行DriverManager.getConnection(“ jdbc:mysql:// localhost:3306 /?useSSL = false”,“用户名”,“密码”); 用户名和密码字段可能错误。输入用于启动mysql客户端的用户名和密码。用户名通常为root,密码为当出现类似Startup screen of mysql

的屏幕时输入的字符串。

注意:您的端口名3306可能不同。

答案 17 :(得分:0)

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

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