Caused by: com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed
2026/7/21 17:27:07 网站建设 项目流程

异常原因

Public Key Retrieval is not allowed是 MySQL 8.0+ 驱动报错:
客户端默认不允许从服务器公钥自动获取,防止中间人劫持,旧连接串没配置对应参数就会抛出该异常。

方案1:连接URL追加参数(最简单,开发环境推荐)

在 jdbc 连接末尾添加allowPublicKeyRetrieval=true&useSSL=false

// MySQL 8 完整示例Stringurl="jdbc:mysql://127.0.0.1:3306/数据库名?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai";

yml配置示例(SpringBoot):

spring:datasource:url:jdbc:mysql://127.0.0.1:3306/test?allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghaiusername:rootpassword:123456driver-class-name:com.mysql.cj.jdbc.Driver

风险提示:allowPublicKeyRetrieval=true生产环境存在安全风险,仅本地开发调试使用。

方案2:生产环境最优解(推荐线上)

方式A:配置SSL证书,开启可信公钥校验

  1. 导出MySQL服务端公钥
SHOWVARIABLESLIKE'ssl_ca';
  1. 将ca证书文件放到项目资源,连接串指定serverSslCert=classpath:xxx.pem,移除allowPublicKeyRetrieval=true

方式B:修改MySQL用户认证方式(彻底规避)

MySQL8 默认caching_sha2_password会触发该问题,改成传统mysql_native_password

-- 修改用户认证插件ALTERUSER'root'@'%'IDENTIFIEDWITHmysql_native_passwordBY'你的密码';FLUSHPRIVILEGES;

改完重启服务,连接串无需加allowPublicKeyRetrieval

完整常见标准连接串(开发)

jdbc:mysql://localhost:3306/dbname?serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false&characterEncoding=utf8mb4

补充说明

  1. 驱动版本:使用mysql-connector-java 8.x才会出现该报错,5.x 无此限制
  2. 安全区分:
    • 本地开发:用方案1快速解决
    • 服务器生产:优先方案2-B改认证插件,或方案2-A配置SSL证书,不要开启allowPublicKeyRetrieval=true

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询