遇到一个问题:
DBeaver连接数据库报错:Public Key Retrieval is not allowed Public Key Retrieval is not allowed,但是Navcat可以直接连接,连接上之后DBeaver也能连接上了,期间没有调整任何配置,两边的连接信息一致
这个问题很常见,主要原因是 MySQL 8 默认启用了 caching_sha2_password
认证插件,而某些客户端(比如老版本的 JDBC 驱动,DBeaver 早期版本可能自带的驱动较旧)默认不支持这种认证方式,导致首次连接时出现 “Public Key Retrieval is not allowed” 的错误。
详细解释与原因分析:
-
caching_sha2_password
认证插件:- MySQL 8 引入了更安全的
caching_sha2_password
作为默认身份验证插件,取代了旧的mysql_native_password
。 - 这种插件使用 SHA256 哈希算法,并结合缓存机制来提高认证效率和安全性。
- 它需要客户端支持公钥检索(Public Key Retrieval)来完成认证过程。
- MySQL 8 引入了更安全的
-
客户端驱动问题:
- 较旧的 JDBC 驱动程序(Java Database Connectivity,Java 数据库连接,DBeaver 底层使用 JDBC 连接数据库)可能没有更新以支持
caching_sha2_password
认证。 - 它们在连接时可能没有正确请求公钥,或者根本不知道如何处理这种认证方式,导致服务器拒绝连接,并抛出 “Public Key Retrieval is not allowed” 错误。
- 较旧的 JDBC 驱动程序(Java Database Connectivity,Java 数据库连接,DBeaver 底层使用 JDBC 连接数据库)可能没有更新以支持
-
Navicat 的作用:
- Navicat 很可能使用了较新的 JDBC 驱动,或者内置了对
caching_sha2_password
的支持。 - Navicat 首次连接成功后,会在 MySQL 服务器端缓存了相关的认证信息(包括公钥等)。
- Navicat 很可能使用了较新的 JDBC 驱动,或者内置了对
-
DBeaver 随后连接成功的原因:
- 因为Navicat已经进行了正确的身份验证,让Mysql服务端缓存了一些信息。
为什么会出现这种情况,以及更深入的解释:
- 首次连接是关键: “Public Key Retrieval is not allowed” 错误通常只在 首次 使用旧驱动连接到使用
caching_sha2_password
的 MySQL 8 服务器时出现。 - 缓存机制:
caching_sha2_password
插件有缓存机制。当一个客户端(如 Navicat)成功连接后,服务器会缓存客户端的公钥和其他认证相关的信息。 - 后续连接复用缓存: 如果随后另一个客户端(如 DBeaver,即使它的驱动较旧)尝试使用相同的用户名和密码连接,MySQL 服务器可能会直接使用缓存的信息进行认证,绕过了公钥检索步骤,从而使 DBeaver 连接成功。 这解释了为什么 DBeaver 在 Navicat 连接后也能连接。
- 缓存过期: 缓存通常有过期时间。如果长时间不连接,缓存可能会失效,DBeaver 再次连接时可能又会遇到 “Public Key Retrieval is not allowed” 错误。
- 安全配置: MySQL服务器端的
allowPublicKeyRetrieval
参数控制是否允许客户端请求公钥. 默认情况下, 为了安全起见, 通常设置为false
. 这就导致了旧的JDBC驱动在没有正确配置的情况下无法获取公钥, 进而无法完成认证.
解决 DBeaver 连接问题的根本方法 (推荐以下方法,不要依赖 Navicat):
-
升级 DBeaver 和 JDBC 驱动 (强烈推荐):
- 下载最新版本的 DBeaver。新版本通常会包含更新的 JDBC 驱动。
- 如果 DBeaver 已经是最新的,可以尝试手动更新 MySQL Connector/J 驱动:
- 在 DBeaver 中,找到你的数据库连接配置。
- 编辑连接,转到 “Driver properties” (驱动属性) 或类似的选项卡。
- 找到 JDBC 驱动文件的路径。
- 从 MySQL 官网下载最新版本的 Connector/J (例如
mysql-connector-java-8.x.x.jar
)。 - 将下载的 JAR 文件替换掉 DBeaver 使用的旧驱动文件。
- 重启 DBeaver。
-
在连接字符串中启用公钥检索 (次推荐,但更方便):
- 在 DBeaver 的连接配置中,找到 “Driver properties” 或 “Advanced” 设置。
- 添加一个属性:
allowPublicKeyRetrieval=true
- 保存并重新连接。
- 注意: 启用
allowPublicKeyRetrieval
可能会降低安全性(虽然影响通常不大,但理论上存在中间人攻击的风险,特别是在不安全的网络环境中)。 如果你的 MySQL 服务器和 DBeaver 在同一台机器上,或者在受信任的局域网内,风险较低。
-
更改 MySQL 用户的认证插件 (不推荐,除非你必须兼容非常旧的客户端):
- 使用管理员权限登录 MySQL。
- 执行以下 SQL 命令(将
your_user
替换为你的用户名):
将身份验证插件更改为ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
mysql_native_password
。 然后刷新权限:FLUSH PRIVILEGES;
- 强烈不推荐此方法,因为它降低了安全性。
mysql_native_password
使用较弱的加密算法,更容易受到攻击。
总结:
最可靠的解决方案是升级 DBeaver 和/或 JDBC 驱动。如果无法升级,可以临时启用 allowPublicKeyRetrieval
,但要注意潜在的安全风险。 绝对不推荐更改用户认证插件为 mysql_native_password
,除非你有充分的理由并且了解其安全影响。