mysql 8.4 默认认证插件为caching_sha2_password,彻底弃用mysql_native_password;新用户自动使用sha-256加密与服务端缓存,旧客户端需升级或显式启用插件才能连接。

MySQL 8.4 默认用 caching_sha2_password,不是 mysql_native_password
MySQL 8.4 LTS 已彻底弃用 mysql_native_password 认证插件(官方标记为 deprecated),默认启用 caching_sha2_password。这意味着:新创建的用户、未显式指定插件的 CREATE USER 或 ALTER USER 操作,都会自动使用 SHA-256 加密 + 服务端缓存机制。
这个变化直接影响客户端连接行为:
- 旧版 MySQL Connector/J(mysql-connector-python 低版本、或未配置 RSA 密钥交换的老客户端,会报错
Public Key Retrieval is not allowed或直接拒绝连接 - 若强制降级为
mysql_native_password,需手动指定且违背 8.4 安全基线,不建议在新部署中采用 -
caching_sha2_password要求传输层加密(TLS)或支持 RSA 密钥交换的明文连接;纯明文无 RSA 的连接会被拒绝
如何创建兼容 TLS/非 TLS 场景的用户
根据你的网络环境和客户端能力,选择对应方式创建用户:
- 推荐(内网+现代客户端):直接使用默认插件,启用 TLS 连接
执行CREATE USER 'appuser'@'%' IDENTIFIED BY 'StrongPass!2026';,然后确保客户端连接时加--ssl-mode=REQUIRED或配置useSSL=true&requireSSL=true - 临时兼容老客户端(仅限测试/内网):显式指定插件并启用 RSA 公钥获取
执行CREATE USER 'legacy'@'192.168.1.%' IDENTIFIED WITH caching_sha2_password BY 'Pass123';,并在启动 mysqld 时确认sha256_password_auto_generate_rsa_keys=ON(默认开启) - 绝对避免:回退到
mysql_native_password
如真需(例如嵌入式设备无法升级),必须显式写死:CREATE USER 'olddev'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx';,但该账号无法用于远程、不支持密码轮换策略、且未来版本可能被完全移除
mysql_secure_installation 必须运行,但它不处理认证插件切换
该工具在 MySQL 8.4 中仍有效,但它的作用范围有限:
- 它会帮你删除匿名用户、禁用 test 数据库、限制 root 仅本地访问——这些仍是基础安全动作
- 它不会把已有
mysql_native_password用户升级为caching_sha2_password,也不会修改 root@'%' 的认证方式 - 如果你之前用 MSI 安装器创建了用户,
mysql_secure_installation可能跳过部分步骤;建议安装后立即手动运行一次 - 运行时若提示 “validate_password plugin not installed”,选 Y 安装;它会强制密码含大小写字母+数字+特殊字符,与
caching_sha2_password的高强度要求天然匹配
检查与验证真实生效状态
别只看命令是否成功,要查数据字典确认实际效果:
- 查用户认证方式:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';,结果中plugin列必须是caching_sha2_password - 查当前连接加密状态:
SELECT Ssl_version, Ssl_cipher FROM performance_schema.status_by_thread WHERE thread_id = CONNECTION_ID();,非空表示 TLS 已启用 - 查 RSA 公钥是否就绪:
SHOW VARIABLES LIKE 'caching_sha2_password_public_key_path';,路径存在且文件可读,说明 RSA 支持已激活 - 最易忽略的一点:Windows 上若用命名管道(Named Pipe)连接 localhost,
caching_sha2_password仍生效,但不会走 TLS;此时依赖的是本地进程间通信隔离,而非网络加密——这点常被误认为“没加密”











