mysql强制ssl需三者同步:用户创建时显式指定require ssl、全局设require_secure_transport=on拦截非加密连接、客户端驱动明确启用ssl握手,缺一不可。

必须用支持它的客户端驱动,且连接时明确启用 SSL 或提供 RSA 公钥——只改服务端配置不解决连接失败问题。
确认当前用户是否真的在用 caching_sha2_password
别凭经验猜,直接查表:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
如果返回的 plugin 是 caching_sha2_password,而你用的是 Navicat 12 以下、mysqlclient default_authentication_plugin 配置只影响新建用户。
客户端连接时必须满足加密条件
caching_sha2_password 要求密码传输必须加密,两种方式二选一:
- 走 SSL/TLS 加密连接(推荐):连接字符串里加
SslMode=Required(.NET)、ssl_mode=REQUIRED(Python pymysql)、&sslMode=REQUIRED(JDBC) - 走非加密连接 + RSA 密钥交换:需客户端显式提供公钥文件,比如 pymysql 加
server_public_key='/path/to/public_key.pem';JDBC 加&allowPublicKeyRetrieval=true(仅限调试,生产禁用)
漏掉任一条件,就会报 Authentication method 'caching_sha2_password' failed 或 Public Key Retrieval is not allowed。
MySQL 服务端要能响应 RSA 或 TLS 请求
光客户端配对没用,服务端也得支持:
- 检查是否已启用 SSL:
SHOW VARIABLES LIKE 'have_ssl';返回YES才行;否则得生成证书并配置ssl-ca/ssl-cert/ssl-key到[mysqld]段 - 验证 RSA 支持:
SELECT @@sha256_password_auto_generate_rsa_keys;应为ON;若为OFF,需设sha256_password_auto_generate_rsa_keys=ON并重启 - 命令行客户端连不上?确保你用的是 MySQL 8.0+ 自带的
mysql,不是系统包管理器装的老版本
常见坑是开了 require_secure_transport=ON 却没配好客户端 SSL 参数,结果所有连接全被拒。
别试图用 my.cnf 一键“降级”认证插件
很多人想在 [client] 段写 default_authentication_plugin=mysql_native_password 来绕过问题——这只能影响本地命令行客户端,对 Navicat、JDBC、pymysql 等完全无效。更危险的是,误以为改了配置就安全了,其实 root 用户的 plugin 字段还是 caching_sha2_password,只是客户端“假装兼容”而已。
真正要兼容旧工具,得用 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx'; FLUSH PRIVILEGES; 显式改用户,且 host 必须和你实际连接的完全一致('root'@'%' 和 'root'@'localhost' 是两个不同用户)。











