1. 问题背景与现象分析
最近在MySQL 8.0+环境中使用JDBC连接时,不少开发者遇到了"Public Key Retrieval is not allowed"的错误提示。这个看似简单的连接错误背后,实际上涉及到MySQL 8.0引入的新安全机制。
当使用较新版本的MySQL Connector/J驱动(8.0+)连接MySQL 8.0+服务器时,如果客户端没有正确配置,就会抛出这个异常。错误信息通常会伴随以下内容:
code复制java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
这个问题的本质是MySQL 8.0默认使用了更安全的caching_sha2_password认证插件,而旧版的mysql_native_password插件已被逐渐淘汰。新插件在身份验证过程中需要交换RSA公钥,但客户端默认禁止自动获取这个公钥,因此导致了连接失败。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解决方案全景图
针对这个连接问题,我们主要有三种解决路径,每种方案适用于不同的场景:
- 客户端配置方案:在JDBC连接字符串中添加参数(快速修复)
- 服务端用户方案:修改MySQL用户的认证方式(长期方案)
- 服务端配置方案:更改MySQL服务器的默认认证插件(系统级方案)
下面我将详细解析每种方案的适用场景、具体操作步骤以及背后的技术原理。
3. 方案一:JDBC客户端配置调整
3.1 连接参数配置
这是最快速的解决方案,特别适合以下场景:
- 你无法修改MySQL服务器配置
- 只是临时需要建立连接
- 开发测试环境使用
在JDBC连接URL中添加两个关键参数:
java复制String url = "jdbc:mysql://localhost:3306/mydb?allowPublicKeyRetrieval=true&useSSL=false";
参数说明:
allowPublicKeyRetrieval=true:允许客户端从服务器获取公钥useSSL=false:禁用SSL加密(仅限测试环境)
注意:在生产环境中,建议保持useSSL=true以确保传输安全
