影评周公子 2026-03-13 08:00 采纳率: 99.1%
浏览 4
已采纳

DBeaver连接MySQL时提示“Public Key Retrieval is not allowed”,如何解决?

在使用 DBeaver 连接 MySQL 8.0+(尤其启用了 `caching_sha2_password` 插件的用户)时,常遇错误:“Public Key Retrieval is not allowed”。该错误源于 JDBC 驱动默认禁止在密码认证过程中主动请求服务器公钥(用于 SHA-256 加密握手),以防范潜在中间人攻击。**根本解决方法**:在 DBeaver 连接配置的「Driver Properties」中,手动添加参数 `allowPublicKeyRetrieval=true`(值为布尔型 true),同时建议一并设置 `useSSL=false`(若非强制要求 TLS)或配置有效 SSL 证书。注意:仅在可信内网环境启用 `allowPublicKeyRetrieval`;生产环境更推荐将用户认证插件改为 `mysql_native_password`(执行 `ALTER USER 'xxx'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd';`)并刷新权限。操作后重启连接即可生效。
  • 写回答

1条回答 默认 最新

  • 秋葵葵 2026-03-13 08:00
    关注
    ```html

    一、现象层:典型错误表现与复现路径

    当使用 DBeaver(v21.0+)连接 MySQL 8.0.4 及以上版本时,若用户账户采用默认的 caching_sha2_password 认证插件(MySQL 8.0 默认策略),常触发如下 JDBC 异常:

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

    该错误在「测试连接」阶段立即抛出,且不依赖具体 SQL 执行——说明问题发生在 TCP 握手后的认证协商阶段。复现条件明确:MySQL 8.0+ + 默认用户 + 未显式配置驱动参数。

    二、协议层:SHA-256 密码交换机制深度解析

    MySQL 8.0 引入 caching_sha2_password 插件后,密码传输不再明文或简单哈希,而是采用基于 RSA 公钥加密的挑战-响应协议:

    1. 客户端发起连接请求;
    2. 服务端返回公钥(或要求客户端主动获取);
    3. 客户端用该公钥加密密码派生密钥并发送;
    4. 服务端解密验证。

    而 JDBC 驱动(mysql-connector-java ≥ 8.0.23)出于安全默认策略,禁止自动请求公钥——此即 allowPublicKeyRetrieval=false 的强制约束。

    三、配置层:DBeaver 驱动属性精准调优

    在 DBeaver 连接编辑界面中,进入「Driver Properties」页,需添加以下关键参数:

    属性名推荐值适用场景说明
    allowPublicKeyRetrievaltrue启用公钥拉取(仅限可信内网)
    useSSLfalsetrue设为 false 可绕过 SSL 证书校验(开发环境);设为 true 则必须配置 serverTimezone 和有效证书路径
    serverTimezoneAsia/Shanghai避免时区解析异常(强烈建议显式声明)

    四、架构层:生产环境安全加固方案对比

    下表对比两类主流解决路径的安全性与运维成本:

    graph LR A[问题根源] --> B{是否可控网络环境?} B -->|是:开发/测试| C[启用 allowPublicKeyRetrieval=true] B -->|否:生产/DMZ| D[切换认证插件] D --> E[ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'] D --> F[FLUSH PRIVILEGES] C --> G[风险:中间人可截获公钥用于离线爆破] F --> H[兼容性:支持所有旧版 JDBC 驱动]

    五、演进层:MySQL 认证插件迁移实操指南

    执行以下 SQL 完成插件降级(需具备 CREATE USER 权限):

    -- 查看当前用户插件
    SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
    
    -- 切换为传统认证(兼容 JDBC 5.x/6.x/7.x)
    ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'StrongPass!2024';
    
    -- 强制刷新权限缓存
    FLUSH PRIVILEGES;

    注意:该操作不影响已建立连接,但新连接将立即生效;若用户有多个 host 段(如 'user'@'localhost'),需逐条执行。

    六、监控层:连接诊断自检清单

    • ✅ 检查 MySQL 版本:SELECT VERSION();
    • ✅ 验证用户插件:SELECT plugin FROM mysql.user WHERE user='xxx';
    • ✅ 确认 DBeaver 使用驱动版本:mysql-connector-java-8.0.33.jar 或更高
    • ✅ 查看 DBeaver 日志(Window → Show View → Error Log)定位底层 SQLException 栈帧
    • ✅ 测试命令行连接:mysql -u xxx -p --default-auth=mysql_native_password

    任一环节异常均可能导致“Public Key Retrieval”错误误判为配置问题,实则为权限或版本错配。

    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 3月14日
  • 创建了问题 3月13日