mysql 8.0 连接报错 caching_sha2_password 不支持或认证失败,源于客户端驱动版本过低或未正确配置认证插件与ssl参数;需升级驱动、显式指定auth_plugin、启用并匹配tls版本及证书验证。
mysql 8.0 连接报错 caching_sha2_password 不支持或认证失败
这是客户端不兼容 mysql 8.0 默认认证插件的典型表现。mysql 8.0+ 默认用 caching_sha2_password,但老版本客户端(如 mysql 5.7 客户端、部分 python 的 mysqlclient、旧版 node.js 驱动)默认只认 mysql_native_password。
解决思路不是降级服务端插件,而是让客户端明确支持它——关键在客户端驱动版本和连接参数:
- Python 用
pymysql:必须 ≥ 0.10.1,且连接时加auth_plugin='caching_sha2_password' - Python 用
mysql-connector-python:≥ 8.0.11,无需额外参数,但需确保没手动指定auth_plugin - Java JDBC:URL 加
&serverRSAPublicKeyFile=...或启用allowPublicKeyRetrieval=true(仅调试,生产禁用) - 命令行
mysql客户端:必须是 MySQL 8.0+ 自带的客户端,旧版会直接拒绝连接
SSL 强制开启后连接被拒:SSL connection error: protocol version mismatch
MySQL 8.0 开启 require_secure_transport=ON 后,所有连接必须走 SSL,但很多客户端默认不协商加密,或 TLS 版本不匹配。
常见原因和对策:
- 客户端未启用 SSL:连接字符串里必须显式加
ssl_disabled=False(Python)、sslMode=REQUIRED(JDBC)、--ssl-mode=REQUIRED(CLI) - 系统缺少可信 CA:Linux 上可能找不到系统 CA 包,需手动指定
ssl_ca=/etc/ssl/certs/ca-certificates.crt - TLS 版本太低:MySQL 8.0.28+ 默认要求 TLSv1.2+,Java 8u251 以下默认只支持 TLSv1;升级 JRE 或在 JDBC URL 加
&enabledTLSProtocols=TLSv1.2 - 自签名证书未验证:开发环境常用,但客户端默认校验失败;可设
ssl_verify_cert=False(Python)或verifyServerCertificate=false(JDBC),但别在生产用
Python 中同时满足 caching_sha2_password + SSL 强制的连接写法
用 pymysql 最稳妥,mysqlclient 对这两个特性支持较弱,容易卡在 RSA 密钥交换环节。
中文敏感词/违禁词检测与内容合规性检查工具。支持对小红书(Xiaohongshu)、Douyin(抖音)、WeChat(微信)、Weibo(微博)、Bilibili(哔哩哔哩)、Zhihu(知乎)、Taobao(淘宝)、JD.com(京东)等主流平台的禁用词、限用词及高风险词进行文本扫描与合规性分析。
最小可用示例(注意字段名和参数名大小写敏感):
import pymysql
conn = pymysql.connect(
host='db.example.com',
user='app_user',
password='xxx',
database='mydb',
port=3306,
ssl={'ca': '/path/to/ca.pem'}, # 必须提供 CA,否则 SSL 握手失败
auth_plugin='caching_sha2_password', # 显式声明,避免自动 fallback 失败
)
如果服务端没配好证书路径,ssl 字典里只留 {} 会触发 SSL connection error: unknown error;空字典 ≠ 禁用 SSL,而是让客户端自己找系统 CA,失败概率高。
MySQL 服务端配置检查点:别漏掉这三项
光改客户端不够,服务端几个关键配置必须对齐,否则客户端再怎么配都连不上:
-
default_authentication_plugin=caching_sha2_password:确认是这行,不是注释掉的那行 -
require_secure_transport=ON:必须是ON,小写on或引号包住会无效 -
ssl_ca、ssl_cert、ssl_key路径要真实存在,且 MySQL 进程有读权限;用mysql -e "SHOW VARIABLES LIKE '%ssl%';"实时核对值
最容易被忽略的是:MySQL 启动后改了 my.cnf,但没执行 sudo systemctl reload mysql(或 service mysqld restart),配置根本没生效。










