DBeaver连接数据库的一个问题

遇到一个问题:

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” 的错误。

详细解释与原因分析:

  1. caching_sha2_password 认证插件:

    • MySQL 8 引入了更安全的 caching_sha2_password 作为默认身份验证插件,取代了旧的 mysql_native_password
    • 这种插件使用 SHA256 哈希算法,并结合缓存机制来提高认证效率和安全性。
    • 它需要客户端支持公钥检索(Public Key Retrieval)来完成认证过程。
  2. 客户端驱动问题:

    • 较旧的 JDBC 驱动程序(Java Database Connectivity,Java 数据库连接,DBeaver 底层使用 JDBC 连接数据库)可能没有更新以支持 caching_sha2_password 认证。
    • 它们在连接时可能没有正确请求公钥,或者根本不知道如何处理这种认证方式,导致服务器拒绝连接,并抛出 “Public Key Retrieval is not allowed” 错误。
  3. Navicat 的作用:

    • Navicat 很可能使用了较新的 JDBC 驱动,或者内置了对 caching_sha2_password 的支持。
    • Navicat 首次连接成功后,会在 MySQL 服务器端缓存了相关的认证信息(包括公钥等)。
  4. 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):

  1. 升级 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。
  2. 在连接字符串中启用公钥检索 (次推荐,但更方便):

    • 在 DBeaver 的连接配置中,找到 “Driver properties” 或 “Advanced” 设置。
    • 添加一个属性:allowPublicKeyRetrieval=true
    • 保存并重新连接。
    • 注意: 启用 allowPublicKeyRetrieval 可能会降低安全性(虽然影响通常不大,但理论上存在中间人攻击的风险,特别是在不安全的网络环境中)。 如果你的 MySQL 服务器和 DBeaver 在同一台机器上,或者在受信任的局域网内,风险较低。
      操作1
      操作2
  3. 更改 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,除非你有充分的理由并且了解其安全影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值