DBeaver连MySQL 8+报“Public Key Retrieval is not allowed”是因为MySQL 8.0默认使用caching_sha2_password插件,非SSL连接需客户端获取RSA公钥加密密码,而JDBC驱动默认禁止该操作以防中间人攻击;解决需在驱动属性设allowPublicKeyRetrieval=true并配合useSSL=false(开发)或正确配置SSL(生产),或服务端改用mysql_native_password认证。

直接改 allowPublicKeyRetrieval=true 就能连上,但必须配合 useSSL=false 或正确配置 SSL,否则还是报错;生产环境别只靠这个参数硬扛。
为什么 DBeaver 连 MySQL 8+ 会卡在 Public Key Retrieval
MySQL 8.0 默认用 caching_sha2_password 插件,非 SSL 连接下要求客户端先向服务端要 RSA 公钥,再加密密码发送。JDBC 驱动(DBeaver 底层用的)默认禁掉这步,防止中间人伪造公钥——所以不是 DBeaver 有问题,是它照着安全规则在执行。
常见错误现象包括:
- 连接测试时弹出
Public Key Retrieval is not allowed - 连接成功后几秒内断开,日志里带
connection was lost - 明明用户名密码没错,却提示认证失败
在 DBeaver 驱动属性里设 allowPublicKeyRetrieval=true
这是最常用、见效最快的改法,但要注意操作细节:
- 右键你的 MySQL 连接 → “编辑连接” → 切到“驱动属性”(Driver Properties)选项卡
- 找
allowPublicKeyRetrieval这一项:如果已有,把值改成true;如果没有,点右上角“显示高级属性”,再搜关键词添加 - 必须同步设置
useSSL=false(开发机本地连)或useSSL=true+ 配好证书(生产环境);只开allowPublicKeyRetrieval不调useSSL,很多版本仍会失败 - 改完一定要点“测试连接”,不能只点“确定”——DBeaver 有些版本不重载未测试过的参数
用 URL 参数方式追加更省事(适合批量改或脚本化)
如果你习惯在“主要”页手动写 JDBC URL,直接在末尾拼参数最直观:
jdbc:mysql://localhost:3306/mydb?allowPublicKeyRetrieval=true&useSSL=false
注意几点:
-
&是 HTML 实体,实际填 URL 时要写成&(DBeaver 会自动转义) - 如果连的是远程服务器,
useSSL=false意味着密码明文传输,仅限内网可信环境 - URL 里设了参数,驱动属性里同名项就以 URL 为准,不会叠加或冲突
真正一劳永逸的方案其实是改 MySQL 用户认证方式
如果团队长期用老版本工具或无法升级驱动,可以服务端降级认证插件,避开公钥流程:
- 用管理员账号登录 MySQL,执行:
ALTER USER 'your_user'@'host' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 立刻跟一句:
FLUSH PRIVILEGES; - 这个操作只影响指定用户,不影响其他用户或全局配置
- 副作用是放弃
caching_sha2_password的密码缓存和 SHA256 加密优势,安全水位略降,但对多数内部系统可接受
真正容易被忽略的是:同一个 DBeaver 实例里,每个 MySQL 连接的驱动属性都是独立保存的。新建连接不会继承旧连接的 allowPublicKeyRetrieval 设置,每次新建都得重新配一遍。











