mysql 8.0 默认认证插件改为 caching_sha2_password,旧版 jdbc 驱动(如 5.1.x)不支持,导致连接报错;应升级驱动至 8.0.28+ 并配置 allowpublickeyretrieval=true&usessl=false,或临时将用户认证降级为 mysql_native_password。

MySQL 8.0 连接报错 caching_sha2_password 是什么问题
MySQL 8.0 默认认证插件从 mysql_native_password 改为 caching_sha2_password,而老版本 JDBC 驱动(如 mysql-connector-java 5.1.x)不支持该插件,连接时会抛出类似 Unknown initial character set index '255' received from server 或 Public Key Retrieval is not allowed 的错误。这不是密码错了,是驱动压根不认识这个认证方式。
升级 JDBC 驱动到 8.0+ 是首选方案
新版驱动原生支持 caching_sha2_password,无需改服务端配置,兼容性和安全性都更好:
- 使用
mysql-connector-java 8.0.28+(推荐 8.0.33 或更高) - Maven 依赖写法:
<dependency><groupid>mysql</groupid><artifactid>mysql-connector-java</artifactid><version>8.0.33</version></dependency>
- 连接 URL 建议显式加上
allowPublicKeyRetrieval=true&useSSL=false(开发环境可接受;生产必须配 TLS) - 如果用 Spring Boot,确认
spring-boot-starter-jdbc拉到的传递依赖是 8.x,可用mvn dependency:tree | grep mysql检查
临时降级 MySQL 用户认证方式(慎用)
仅限测试或无法升级驱动的遗留系统,本质是让 MySQL 回退到旧协议:
- 登录 MySQL(用 root 或有
CREATE USER权限的账号):ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
- 刷新权限:
FLUSH PRIVILEGES; - 注意事项:
-
'your_user'@'%'要和应用实际连接的 host 完全一致(比如可能是'your_user'@'localhost') - 该操作只影响指定用户,不影响其他用户或全局默认插件
-
mysql_native_password不支持 SHA-2 加密,安全性低于caching_sha2_password - 某些云数据库(如阿里云 RDS)可能禁用该语法,需走控制台重置认证方式
-
为什么不能只加 useSSL=false 就完事
单纯在连接串里加 useSSL=false 并不能解决认证失败,它只关闭 TLS 握手,但驱动仍要协商认证流程。真正卡住的是:
- 驱动没实现
caching_sha2_password握手逻辑(5.1.x 完全没有) - 即使是 6.0.x/7.0.x 驱动,也常需要配合
allowPublicKeyRetrieval=true才能完成公钥交换步骤 - MySQL 8.0.21+ 默认禁止公钥检索(
require_secure_transport=ON时更严格),不设参数会直接拒绝连接
驱动版本、连接参数、MySQL 用户插件三者必须对齐,漏掉任一环都会报错。最容易被忽略的是:本地开发用的是新驱动,但打包部署时 classpath 里混进了老 jar —— 这种情况建议用 java -verbose:class 看实际加载的是哪个 com.mysql.cj.jdbc.Driver。











