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

我尝试使用连接器8.0.11连接MySQL数据库与Java。一切似乎都很好,但我得到这个异常:

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)
 

下面是我的Connection 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();
}
}
472983 次浏览

你应该在你的mysql-connector allowPublicKeyRetrieval=true中添加client选项,以允许客户端自动从服务器请求公钥。请注意,allowPublicKeyRetrieval=True可能允许恶意代理执行MITM攻击以获取明文密码,因此它默认为False,必须显式启用。

< a href = " https://mysql-net.github。io / MySqlConnector /连接选项/ noreferrer“rel = > https://mysql-net.github.io/MySqlConnector/connection-options/ < / >

你也可以在测试/开发时添加useSSL=false

例子:

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

使用jdbc url作为:

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

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

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

作为建议的答案,您可以尝试使用mysql_native_password身份验证插件而不是caching_sha2_password身份验证插件。

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

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

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

在我的例子中,是用户错误。我正在使用密码无效的root用户。我不知道为什么我没有得到一个认证错误,而是收到了这个神秘的消息。

在我的情况下,上述错误实际上是由于错误的用户名和密码。 解决方法: 1. 打开DriverManager.getConnection("jdbc:mysql://localhost:3306/? "useSSL=false", "用户名","密码"); 用户名和密码字段可能错误。输入用于启动mysql客户端的用户名和密码。用户名通常是root,密码是当出现类似屏幕mysql启动界面

时输入的字符串

注意:在您的情况下,端口名3306可能不同。

我发现这个问题令人沮丧,因为我昨天能够与数据库交互,但今天早上回来后,我开始得到这个错误。

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

为我修复的是在Eclipse中做Project->Clean,在Tomcat服务器上做Clean。其中一个(或两个)解决了问题。

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

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

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

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

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

command: --default-authentication-plugin=mysql_native_password

更新useSSL=true在春季启动应用程序连接mysql;

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

对于DBeaver用户:

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

  2. 关于“连接设置”;屏幕(主屏幕)点击“编辑驱动程序设置”;

  3. 点击“;连接属性”,(在最近的版本中,它命名为“;驱动程序属性")

  4. 右击“用户属性”;区域,选择“添加新属性”;

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

  6. 将它们的值设置为“;false”;和“;true"双击“value”;列

在dockerizing我们现有的应用程序时,我也面临着这样的问题。解决方案是在JDBC连接字符串中添加MySQL的allowPublicKeyRetrieval连接选项,值为真正的。 如果这不起作用,尝试将useSSL选项添加到

结果字符串看起来像这样:

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

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

您可以从MySQL工作台或命令行中检查相同的使用

mysql -u USERNAME -p

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

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

当从DBeaver执行此操作时,我必须去&;连接设置&;→“SSL"TAB,然后:

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

这就是它的样子。 DBeaver configuration < / p >

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


Server Time Zone设置为我的本地位置,修复了这个问题。


ServerTimeZone .

我的问题是在pom.xml(弹簧引导)。 我的pom.xml有两个不同数据库的依赖项。确保只保留MySQL依赖项,并删除任何其他数据库依赖项

另一种方法,在DBeaver上。

您可以编辑数据库的连接,在连接设置中进入SSL选项卡。这里有一个“允许公钥检索”复选框;把它标记为真的。那问题就解决了。

在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的旧客户端/连接一起工作)
  • useSSL = true
  • useSSL=false并配置公钥检索(这并不意味着使用allowPublicKeyRetrieval=true可以避免错误-但违背了这种额外安全性的目标并且速度较慢-它确实意味着使用类似server-public-key-path的东西来指向公钥的客户端副本)

当我遇到“public-key-retrieval-is-not-allowed”问题时,我更新了此参数;使用根帐户。

DBeaver update this parameter

spring.datasource.url=jdbc:mysql://localhost:3306/database?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false

您可以将这一行插入到应用程序中。属性文件,这意味着,

  • 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文件的dependencies中添加了以下依赖项。

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.23</version>
</dependency>

enter image description here

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