【已解决】项目启动,报错:java.sql :Public Key Retrieval is not allowed

  • 作者: 凯哥Java(公众号:凯哥Java)
  • 经验分享
  • 时间:2023-11-17 16:48
  • 1102人已阅读
简介 项目启动报错信息如下:java.sql.SQLNonTransientConnectionException:PublicKeyRetrievalisnotallowed原因分析:这个错误Causedby:com.mysql.cj.exceptions.UnableToConnectException:PublicKeyRetrievalisnotallowed通常发生在尝试连接MySQL8或更高

🔔🔔好消息!好消息!🔔🔔

 如果您需要注册ChatGPT,想要升级ChatGPT4。凯哥可以代注册ChatGPT账号代升级ChatGPT4

有需要的朋友👉:微信号 kaigejava2022

项目启动报错信息如下:

java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed

55e94574684942077d49c927d6e96e45.png原因分析:

这个错误 Caused by: com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed 通常发生在尝试连接 MySQL 8 或更高版本的数据库时,特别是在使用了较新版本的 MySQL Connector/J(JDBC 驱动程序)的情况下。这是因为 MySQL 8 默认使用了更加安全的密码认证机制(caching_sha2_password),而 JDBC 驱动在默认配置下不允许检索服务器的公钥来进行身份验证。


解决这个问题的常见方法有两种:


方法 1:在 JDBC URL 中允许公钥检索

你可以在数据库连接 URL 中添加一个参数来允许公钥检索。这是解决这个问题的最直接方式。修改你的 JDBC URL,添加 allowPublicKeyRetrieval=true 参数:

这里 useSSL=false 是可选的,取决于你的 SSL 配置。请注意,只有在你确定数据库连接是安全的情况下,才应该使用这个配置。


方法 2:更改 MySQL 用户的认证机制

另一种解决方案是更改 MySQL 用户账户的密码认证机制,从 caching_sha2_password 更改为 mysql_native_password。这可以通过运行以下 SQL 命令在 MySQL 中完成:


ALTER USER 'username'@'hostname' IDENTIFIED WITH 'mysql_native_password' BY 'password';

1

在这里,将 username、hostname 和 password 替换为实际的用户名、主机名和新密码。更改认证机制后,你可能需要重启 MySQL 服务器。

安全性考虑

方法 1(允许公钥检索)可能涉及安全风险,特别是在不安全的网络环境中。确保你了解这样做的潜在风险,特别是如果你的数据库连接不是通过 SSL 加密的。在开发环境中,这个方法通常是可接受的,但在生产环境中,你应该考虑更安全的选项。


方法 2(更改认证机制)虽然在某些情况下是必要的,但请注意,mysql_native_password 认证机制不如 caching_sha2_password 安全。如果你选择这种方法,请确保你的数据库环境足够安全,并考虑实施其他安全措施,如网络层的安全配置。


其他可能的解决方案

确保你使用的是与 MySQL 服务器版本兼容的 JDBC 驱动程序。对于 MySQL 8.0,推荐使用最新版本的 MySQL Connector/J。

如果你正在使用连接池或其他数据源管理工具,同样需要确保在那里的配置也正确设置了 allowPublicKeyRetrieval 和 useSSL 参数。

在应用任何更改后,建议重新启动应用程序和/或连接池,以确保新的配置生效。如有必要,也请重新启动 MySQL 服务器。



TopTop