在使用 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 公钥加密的挑战-响应协议:- 客户端发起连接请求;
- 服务端返回公钥(或要求客户端主动获取);
- 客户端用该公钥加密密码派生密钥并发送;
- 服务端解密验证。
而 JDBC 驱动(mysql-connector-java ≥ 8.0.23)出于安全默认策略,禁止自动请求公钥——此即
allowPublicKeyRetrieval=false的强制约束。三、配置层:DBeaver 驱动属性精准调优
在 DBeaver 连接编辑界面中,进入「Driver Properties」页,需添加以下关键参数:
属性名 推荐值 适用场景说明 allowPublicKeyRetrievaltrue启用公钥拉取(仅限可信内网) useSSLfalse或true设为 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”错误误判为配置问题,实则为权限或版本错配。
```本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报