Skip to content
0

MySQL 8.4 认证失败

具体错误

Public Key Retrieval is not allowed

原因分析

在连接 MySQL 时遇到 Public Key Retrieval is not allowed 错误,通常是由于客户端与服务器的身份验证方式不兼容导致的,尤其是当服务器使用 caching_sha2_password 认证插件时,客户端可能需要显式允许获取公钥。以下是具体解决方法:

MySQL 8.0 及以上版本默认使用 caching_sha2_password 作为默认认证插件(替代了旧版的 mysql_native_password)。当客户端连接时,如果服务器要求通过公钥加密方式验证,而客户端未开启「允许获取公钥」的配置,就会触发该错误。

解决方法

1. 连接时添加允许公钥检索的参数

在连接 MySQL 的配置中添加 allowPublicKeyRetrieval=true 参数,允许客户端获取服务器的公钥。

命令行连接示例:

shell
mysql -u 用户名 -p -h 主机名 --allow-public-key-retrieval

程序连接示例(以 Go 为例):在 DSN(数据源名称)中添加参数:

go
dsn := "用户名:密码@tcp(主机:端口)/数据库名?charset=utf8mb4&parseTime=True&loc=Local&allowPublicKeyRetrieval=true"
db, err := sql.Open("mysql", dsn)

其他客户端(如 Navicat、DBeaver):在连接设置的「高级」或「参数」中,添加 allowPublicKeyRetrieval=true。

2. (可选)修改用户的认证插件为旧版兼容模式

如果不希望使用 caching_sha2_password,可以将用户的认证插件修改为兼容性更好的 mysql_native_password(适合旧客户端):

登录 MySQL 服务器(使用 root 或有权限的用户):

shell
mysql -u root -p

执行以下 SQL 语句修改用户认证插件(替换 用户名 和 密码):

sql
ALTER USER '用户名'@'主机' IDENTIFIED WITH mysql_native_password BY '密码';
FLUSH PRIVILEGES; -- 刷新权限

主机通常为 %(允许所有主机连接)或具体 IP(如 localhost)。

总结

推荐优先使用第一种方法(添加 allowPublicKeyRetrieval=true),既兼容新版 MySQL 的安全认证机制,又无需修改服务器配置。如果客户端过于老旧不支持 caching_sha2_password,再考虑第二种方法切换认证插件。

最近更新