1. 错误背景与现象解析
"Public Key Retrieval is not allowed"是MySQL Connector/J 8.0+版本中常见的连接错误。当客户端尝试通过SSL/TLS连接到MySQL服务器时,如果服务器要求提供公钥但客户端配置禁止获取公钥,就会触发此异常。典型报错信息如下:
code复制java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
这个错误通常出现在以下场景:
- 使用MySQL 8.0+版本作为数据库服务端
- 客户端使用Connector/J 8.0+驱动
- 连接字符串中启用了SSL加密(useSSL=true)
- 用户认证方式为caching_sha2_password(MySQL 8.0默认认证插件)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术原理深度剖析
2.1 MySQL 8.0认证机制变更
MySQL 8.0将默认认证插件从mysql_native_password改为caching_sha2_password,这是引发该问题的根本原因。新认证插件的工作流程:
- 客户端发起连接请求
- 服务端返回加密盐值(salt)和公钥请求
- 客户端需要获取服务端公钥来加密密码
- 如果客户端配置禁止公钥获取(allowPublicKeyRetrieval=false),则抛出异常
2.2 SSL与公钥获取的关系
当useSSL=true时,Connector/J会强制验证服务端证书。但在以下两种情况仍需要单独获取公钥:
- SSL连接建立前需要加密密码交换
- 服务器未配置SSL证书但使用caching_sha2_password插件
3. 解决方案与配置实践
3.1 基础解决方案
在JDBC连接URL中添加参数:
code复制jdbc:mysql://host:3306/db?allowPublicKeyRetrieval=true
3.2 生产环境推荐方案
方案1:使用SSL证书(推荐)
code复制jdbc:mysql://host:3306/db?
useSSL=true&
requireSSL=true&
verif
