MySQL 8.0升级后老客户端连不上主因是认证插件变为caching_sha2_password,需执行ALTER USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'p'并FLUSH PRIVILEGES;若仍失败,检查SHOW PLUGINS确认mysql_native_password是否ACTIVE,否则需在my.cnf中添加plugin_load_add配置并重启。

MySQL 8.0 升级后老客户端连不上,不是证书问题,是认证插件被换了
MySQL 8.0 默认把 default_authentication_plugin 改成了 caching_sha2_password,而很多老工具(比如旧版 Node.js 的 mysql 包、Navicat 12 及更早、PHP mysqli 扩展未更新等)压根不支持这个插件。报错典型是:
Error 1045: Access denied for user 'u'@'%' (using password: YES) Error 2059: Authentication plugin 'caching_sha2_password' cannot be loaded ER_NOT_SUPPORTED_AUTH_MODE
这些都不是 SSL 证书或密钥的问题——根本没走到加密传输那步,卡在了身份认证第一关。
怎么确认当前用户用的是哪种认证方式
登录 MySQL 后执行:
SELECT user, host, plugin FROM mysql.user;
重点关注 plugin 列。如果看到 caching_sha2_password 或 sha256_password,而你的客户端不支持,就得改;如果是 mysql_native_password 却连不上,那可能是插件本身被禁用了(尤其在 MySQL 8.4+)。
-
mysql_native_password在 MySQL 8.4 中已默认不加载,需手动启用(见下一条) -
caching_sha2_password要求客户端支持 SHA2 加密 + TLS 握手协商,旧驱动常缺其中一环 - 注意:只改密码(
SET PASSWORD)不会改变plugin,必须显式用IDENTIFIED WITH
ALTER USER 切回 mysql_native_password 但还是连不上?检查插件是否加载
在 MySQL 8.4 或某些严格配置的 8.0+ 实例中,即使你执行了:
ALTER USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'p';
仍可能报错 Plugin 'mysql_native_password' is not loaded。这是因为服务端根本没加载该插件。
- 检查插件状态:
SHOW PLUGINS;看mysql_native_password行的Status是否为ACTIVE - 若非 ACTIVE,需在
my.cnf的[mysqld]段添加:plugin_load_add = mysql_native_password.so(Linux)或mysql_native_password.dll(Windows) - 重启 MySQL 生效;仅靠 SQL 命令无法动态加载已禁用插件
- MySQL 8.4 开始,该插件已被标记为
Deprecated,官方建议只用于临时兼容,不可长期依赖
SSL 证书和密钥其实没变,但 require_secure_transport 会拦住明文连接
MySQL 8.0 引入了 require_secure_transport = ON 默认策略,它不关心你用什么认证插件,而是强制所有连接走加密通道(TLS)。如果你没配证书,或客户端没开 TLS,就会直接拒绝连接,错误类似:
ERROR 3159 (HY000): Connections using insecure transport are prohibited
- 这不是加密算法问题,是传输层策略;
caching_sha2_password本身也依赖 TLS 完成密钥交换 - 临时绕过:在
my.cnf中设require_secure_transport = OFF,然后重启 - 生产环境别关它——应生成并部署有效证书,或让客户端明确指定
?ssl-mode=REQUIRED(JDBC)或ssl: true(Node.js) - 证书路径配置项是
ssl_ca、ssl_cert、ssl_key,不是换算法就能绕过的
真正卡住多数人的,从来不是证书更新,而是没意识到 plugin 和 require_secure_transport 是两道独立的门——一道管“你是谁”,一道管“你怎么来”。漏掉任意一个,连接就断在半路。


















