根本原因是客户端不支持caching_sha2_password插件的RSA公钥交换或TLS加密握手协议;需升级客户端驱动(如PyMySQL≥1.0.2)或改用mysql_native_password认证并执行FLUSH PRIVILEGES。

MySQL 8.0 默认就是 caching_sha2_password,不需要额外配置认证方式——真正要做的,是让客户端能连上它。
为什么连不上 caching_sha2_password?
报错如 authentication plugin 'caching_sha2_password' cannot be loaded 或 client does not support authentication protocol requested by server,根本原因不是服务端没配好,而是客户端不认这个插件。MySQL 8.0+ 的 root、新创建用户默认都用它,但老版本驱动(比如 PyMySQL
- 这不是密码错误,重输没用
- 也不是 MySQL 没启动,是握手阶段协议不匹配就断开了
- 命令行用
mysql -u root -p报错?大概率是你系统里装的是 MySQL 5.7 的客户端,不是 8.0 自带的
Python 连接必须显式指定 auth_plugin 吗?
取决于你用的驱动:
-
pymysql≥ 0.10.1:可以不写auth_plugin,但必须确保没手动覆盖成mysql_native_password;若仍失败,加auth_plugin='caching_sha2_password'是最稳的兜底写法 -
mysql-connector-python≥ 8.0.11:完全自动识别,无需任何额外参数 -
mysqlclient:不推荐用于caching_sha2_password场景,底层依赖 C 库,容易卡在 RSA 公钥获取环节;即使升级到最新版,也常需配合--ssl-mode=REQUIRED才能过认证
示例(pymysql 安全写法):
安全的随机密码生成器。支持自定义长度、字符类型(大写/小写字母、数字、特殊符号),排除相似字符,批量生成。纯 Python 标准库,无需 API 密钥。
import pymysql
conn = pymysql.connect(
host='localhost',
user='root',
password='xxx',
database='test',
auth_plugin='caching_sha2_password' # 显式声明,避免隐式 fallback
)SSL 强制开启后连接直接被拒怎么办?
当 MySQL 配置了 require_secure_transport=ON,所有连接必须走加密通道,此时仅支持 caching_sha2_password 的客户端还可能因 TLS 协商失败而中断。
- 常见错误:
SSL connection error: protocol version mismatch - Java 客户端需确认 JRE 版本 ≥ 8u251(否则默认只支持 TLSv1),或在 JDBC URL 加
&enabledTLSProtocols=TLSv1.2 - Linux 下 Python 若提示 CA 证书找不到,可显式指定:
ssl_ca='/etc/ssl/certs/ca-certificates.crt' - 开发环境用自签名证书?设
ssl_verify_cert=False(仅限调试)
关键点:SSL 不只是“开或关”,它和认证插件是耦合的——caching_sha2_password 在非 SSL 连接下会尝试 RSA 密钥交换;一旦服务端要求 SSL,客户端就必须完成 TLS 握手,之后才进入认证流程。
改 default_authentication_plugin 能一劳永逸?
不能。在 my.cnf 里写 default_authentication_plugin=mysql_native_password 只影响后续 CREATE USER 的默认行为,对已存在的用户(尤其是升级上来的 root)完全无效。
- 查当前用户插件:
SELECT user, host, plugin FROM mysql.user; - 改 root:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; - 别忘了
FLUSH PRIVILEGES;
这个操作本质是绕过问题,不是解决问题。生产环境应优先升级客户端栈,而非降级服务端安全能力——caching_sha2_password 支持盐值、迭代哈希、RSA 安全交换,这些在 mysql_native_password 里都不存在。


















