在使用 Java 的 JDBC 驱动(如 MySQL Connector/J)连接 MySQL 数据库时,可能会遇到以下错误提示:
Public Key Retrieval is not allowed
错误原因
此问题通常与 MySQL 默认的身份验证插件 caching_sha2_password
有关。当 MySQL 用户使用该插件时,客户端需要从服务器检索公钥以进行身份验证。但出于安全考虑,MySQL 默认不允许公钥检索,导致连接失败。
解决方案
方法一:修改 JDBC URL
在数据库连接字符串中添加 allowPublicKeyRetrieval=true
参数,使客户端能够从服务器检索公钥。
修改前:
jdbc:mysql://localhost:3306/databasename?useSSL=false
修改后:
jdbc:mysql://localhost:3306/databasename?useSSL=false&allowPublicKeyRetrieval=true
完整示例:
jdbc:mysql://localhost:3306/testdb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
方法二:切换身份验证插件
如果不能修改客户端配置,可以通过修改用户的身份验证插件解决问题。将用户的插件从 caching_sha2_password
切换为 mysql_native_password
:
执行以下 SQL 命令:
ALTER USER 'username'@'host' IDENTIFIED WITH mysql_native_password BY 'password'; FLUSH PRIVILEGES;
方法三:更新 MySQL JDBC 驱动
确保 MySQL Connector/J 的版本是最新的(建议使用 8.x 版本)。旧版本的驱动程序可能不支持 caching_sha2_password
插件。
可以从 MySQL 官方下载页面 获取最新的驱动。
方法四:启用 SSL 加密
启用 SSL 参数以避免客户端直接检索公钥:
jdbc:mysql://hostname:3306/databasename?useSSL=true&requireSSL=true
方法五:调整服务器设置(开发环境使用)
在 MySQL 配置文件(my.cnf
或 my.ini
)中添加以下配置,强制使用 mysql_native_password
作为默认认证插件:
[mysqld] default_authentication_plugin=mysql_native_password
然后重启 MySQL 服务:
# Linux 系统 sudo systemctl restart mysql
注意:此方法仅适用于开发环境,生产环境建议保留默认的
caching_sha2_password
以确保更高的安全性。
注意事项
-
生产环境安全性: 如果使用
allowPublicKeyRetrieval=true
,请确保数据库连接通过 安全网络(如 VPN)进行,以防止中间人攻击。 -
日志分析: 如果以上方法都无效,请检查错误日志中的堆栈信息,定位是否还有其他配置问题。