异常原因
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证书,开启可信公钥校验
- 导出MySQL服务端公钥
SHOWVARIABLESLIKE'ssl_ca';- 将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补充说明
- 驱动版本:使用
mysql-connector-java 8.x才会出现该报错,5.x 无此限制 - 安全区分:
- 本地开发:用方案1快速解决
- 服务器生产:优先方案2-B改认证插件,或方案2-A配置SSL证书,不要开启
allowPublicKeyRetrieval=true