连接 Java - MySQL : Public 不允许密钥检索
Connection Java - MySQL : Public Key Retrieval is not allowed
我尝试使用连接器 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)
这是我的连接管理器class:
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();
}
}
您应该将客户端选项添加到您的 mysql-连接器 allowPublicKeyRetrieval=true
以允许客户端自动从服务器请求 public 密钥。请注意,allowPublicKeyRetrieval=True
可能允许恶意代理执行 MITM 攻击以获取明文密码,因此默认情况下为 False,必须明确启用。
https://mysql-net.github.io/MySqlConnector/connection-options/
您也可以在将其用于 testing/develop 目的时尝试添加 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。请确保您在构建路径中添加的驱动程序 - "add external 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", "username", "password");
字段用户名和密码可能是错误的。输入用于启动 mysql 客户端的用户名和密码。用户名一般为root,密码为出现类似画面时输入的字符串Startup screen of mysql
注意:您的端口名称 3306 可能有所不同。
我发现这个问题令人沮丧,因为我昨天能够与数据库交互,但今天早上回来后,我开始收到这个错误。
我尝试添加 allowPublicKeyRetrieval=true
标志,但我一直收到错误消息。
为我解决问题的是在 Eclipse 中执行 Project->Clean
并在我的 Tomcat 服务器上执行 Clean
。其中一个(或两个)修复了它。
我不明白为什么,因为我使用 Maven 构建我的项目,并且在每次代码更改后都重新启动我的服务器。很气人...
将连接 URL 作为
jdbc:mysql://localhost:3306/hb_student_tracker?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
如果在连接 mysql(本地或 mysql 容器 运行 和 mysql 时出现以下错误:
java.sql.SQLNonTransientConnectionException: Public 不允许密钥检索
解决方法:
在您的数据库服务中添加以下行:
command: --default-authentication-plugin=mysql_native_password
更新 spring 引导应用程序连接中的 useSSL=true 与 mysql;
jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC
DBeaver 用户:
右键单击您的连接,选择“编辑连接”
在“连接设置”屏幕(主屏幕)上单击“编辑驱动程序设置”
单击“连接属性”,(在最近的版本中它命名为“驱动程序属性”)
右键单击“用户属性”区域并选择“添加新属性”
添加两个属性:“useSSL”和“allowPublicKeyRetrieval”
通过双击“值”列将它们的值设置为“false”和“true”
我在对现有应用程序进行 docker 化时也遇到了这样的问题。解决方案是将 MySQL 的 allowPublicKeyRetrieval 连接选项添加到 JDBC 连接字符串,值为 true。
如果这不起作用,请尝试将 useSSL 选项也添加到 false。
生成的字符串如下所示:
jdbc:mysql://<database server ip>:3306/databaseName?allowPublicKeyRetrieval=true&useSSL=false
首先,请确保您的数据库服务器已启动并且 运行。
我遇到了同样的错误,在尝试了此处列出的所有答案后,我发现我的数据库服务器不是 运行.
您可以从 MySQL Workbench 或命令行使用
检查相同内容
mysql -u USERNAME -p
这听起来很明显,但很多时候我们假设数据库服务器一直在 运行,特别是当我们在本地机器上工作时,当我们 restart/shutdown 机器,数据库服务器将自动关闭。
这也可能是由于用户名或密码错误造成的。
作为解决方案,我添加了 allowPublicKeyRetrieval=true&useSSL=false
部分,但仍然出现错误,然后我检查了密码,结果是错误的。
从 DBeaver 执行此操作时,我必须转到“连接设置”->“SSL”选项卡,然后:
- 取消选中“验证服务器证书”
- 选中“允许 public 密钥检索”
这是它的样子。
请注意,这仅适用于本地开发。
Setting Server Time Zone
to my local place, fixed the issue.
我的问题出在 pom.xml
(spring 启动)。
我的 pom.xml 有两个不同数据库的依赖项。确保仅保留 MySQL 依赖项并删除任何其他数据库依赖项。
另一种方式,在 DBeaver 上。
您可以编辑数据库的连接,转到连接设置中的 SSL 选项卡。有一个复选框“允许 public 密钥检索”将其标记为 true。这样问题就解决了。
在 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 连接必须执行以下操作之一:
- 使用安全连接 (useSSL=true)
- 使用支持使用 RSA 密钥对交换密码的未加密连接(使用 SSL=false 和其他配置参数 - 参见 https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html)
您有几个选择:
- 改变用户使用 mysql_native_password 插件(就像它在历史上的表现一样,也可以与不支持 caching_sha2_password 的旧客户端/连接一起工作)
- useSSL=true
- useSSL=false 并配置 public 密钥检索(这并不意味着使用 allowPublicKeyRetrieval=true 可以避免错误 - 但会破坏 objective 这种额外的安全性并且速度很慢 - 它确实意味着使用 server-public-key-path 之类的东西指向 public 密钥的客户端副本)
当我遇到“public-key-retrieval-is-not-allowed”与 root 帐户的问题时,我更新了这个参数。
spring.datasource.url=jdbc:mysql://localhost:3306/database?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false
您可以将此行插入到您的 applications.properties 文件中,这意味着,
spring.datasource.url=jdbc:mysql://localhost:3306/
这个使用 mysql 作为数据库服务。我认为这可以通过使用相关名称和数据库名称的端口来改变。
database?createDatabaseIfNotExist=true
= 使用名为 database 的数据库,如果您还没有创建这样的数据库,请创建一个新的。
allowPublicKeyRetrieval=true
= 允许客户端自动向服务器请求 public 密钥。 (这部分可能是额外的)
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>
我尝试使用连接器 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)
这是我的连接管理器class:
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();
}
}
您应该将客户端选项添加到您的 mysql-连接器 allowPublicKeyRetrieval=true
以允许客户端自动从服务器请求 public 密钥。请注意,allowPublicKeyRetrieval=True
可能允许恶意代理执行 MITM 攻击以获取明文密码,因此默认情况下为 False,必须明确启用。
https://mysql-net.github.io/MySqlConnector/connection-options/
您也可以在将其用于 testing/develop 目的时尝试添加 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。请确保您在构建路径中添加的驱动程序 - "add external 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", "username", "password"); 字段用户名和密码可能是错误的。输入用于启动 mysql 客户端的用户名和密码。用户名一般为root,密码为出现类似画面时输入的字符串Startup screen of mysql
注意:您的端口名称 3306 可能有所不同。
我发现这个问题令人沮丧,因为我昨天能够与数据库交互,但今天早上回来后,我开始收到这个错误。
我尝试添加 allowPublicKeyRetrieval=true
标志,但我一直收到错误消息。
为我解决问题的是在 Eclipse 中执行 Project->Clean
并在我的 Tomcat 服务器上执行 Clean
。其中一个(或两个)修复了它。
我不明白为什么,因为我使用 Maven 构建我的项目,并且在每次代码更改后都重新启动我的服务器。很气人...
将连接 URL 作为 jdbc:mysql://localhost:3306/hb_student_tracker?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
如果在连接 mysql(本地或 mysql 容器 运行 和 mysql 时出现以下错误:
java.sql.SQLNonTransientConnectionException: Public 不允许密钥检索
解决方法: 在您的数据库服务中添加以下行:
command: --default-authentication-plugin=mysql_native_password
更新 spring 引导应用程序连接中的 useSSL=true 与 mysql;
jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=true&useLegacyDatetimeCode=false&serverTimezone=UTC
DBeaver 用户:
右键单击您的连接,选择“编辑连接”
在“连接设置”屏幕(主屏幕)上单击“编辑驱动程序设置”
单击“连接属性”,(在最近的版本中它命名为“驱动程序属性”)
右键单击“用户属性”区域并选择“添加新属性”
添加两个属性:“useSSL”和“allowPublicKeyRetrieval”
通过双击“值”列将它们的值设置为“false”和“true”
我在对现有应用程序进行 docker 化时也遇到了这样的问题。解决方案是将 MySQL 的 allowPublicKeyRetrieval 连接选项添加到 JDBC 连接字符串,值为 true。 如果这不起作用,请尝试将 useSSL 选项也添加到 false。
生成的字符串如下所示:
jdbc:mysql://<database server ip>:3306/databaseName?allowPublicKeyRetrieval=true&useSSL=false
首先,请确保您的数据库服务器已启动并且 运行。 我遇到了同样的错误,在尝试了此处列出的所有答案后,我发现我的数据库服务器不是 运行.
您可以从 MySQL Workbench 或命令行使用
检查相同内容mysql -u USERNAME -p
这听起来很明显,但很多时候我们假设数据库服务器一直在 运行,特别是当我们在本地机器上工作时,当我们 restart/shutdown 机器,数据库服务器将自动关闭。
这也可能是由于用户名或密码错误造成的。
作为解决方案,我添加了 allowPublicKeyRetrieval=true&useSSL=false
部分,但仍然出现错误,然后我检查了密码,结果是错误的。
从 DBeaver 执行此操作时,我必须转到“连接设置”->“SSL”选项卡,然后:
- 取消选中“验证服务器证书”
- 选中“允许 public 密钥检索”
这是它的样子。
请注意,这仅适用于本地开发。
Setting
Server Time Zone
to my local place, fixed the issue.
我的问题出在 pom.xml
(spring 启动)。
我的 pom.xml 有两个不同数据库的依赖项。确保仅保留 MySQL 依赖项并删除任何其他数据库依赖项。
另一种方式,在 DBeaver 上。
您可以编辑数据库的连接,转到连接设置中的 SSL 选项卡。有一个复选框“允许 public 密钥检索”将其标记为 true。这样问题就解决了。
在 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 连接必须执行以下操作之一:
- 使用安全连接 (useSSL=true)
- 使用支持使用 RSA 密钥对交换密码的未加密连接(使用 SSL=false 和其他配置参数 - 参见 https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html)
您有几个选择:
- 改变用户使用 mysql_native_password 插件(就像它在历史上的表现一样,也可以与不支持 caching_sha2_password 的旧客户端/连接一起工作)
- useSSL=true
- useSSL=false 并配置 public 密钥检索(这并不意味着使用 allowPublicKeyRetrieval=true 可以避免错误 - 但会破坏 objective 这种额外的安全性并且速度很慢 - 它确实意味着使用 server-public-key-path 之类的东西指向 public 密钥的客户端副本)
当我遇到“public-key-retrieval-is-not-allowed”与 root 帐户的问题时,我更新了这个参数。
spring.datasource.url=jdbc:mysql://localhost:3306/database?createDatabaseIfNotExist=true&allowPublicKeyRetrieval=true&useSSL=false
您可以将此行插入到您的 applications.properties 文件中,这意味着,
spring.datasource.url=jdbc:mysql://localhost:3306/
这个使用 mysql 作为数据库服务。我认为这可以通过使用相关名称和数据库名称的端口来改变。database?createDatabaseIfNotExist=true
= 使用名为 database 的数据库,如果您还没有创建这样的数据库,请创建一个新的。allowPublicKeyRetrieval=true
= 允许客户端自动向服务器请求 public 密钥。 (这部分可能是额外的)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>