MySQL 报Public Key Retrieval is not allowed 错误问题解决
文章目录
耗子上树撵猫 2021-10-14
问题出现原因:
我的MySQL是使用docker的docker pull mysql命令直接拉取MySQL的镜像,并使用docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql创建的docker容器运行的MySQL。
这个时候问题就出现了,我在本机上使用Navicat15能正常连接我Linux上的MySQL服务:
而当我在服务中配置好MySQL的连接信息,并启动服务时,服务报SQLTransientConnectionException错误:
我在网上搜索了关键句RSA public key is not available client side (option serverRsaPublicKeyFile not set)结果原因说是:用户使用了 sha256_password 认证,密码在传输过程中必须使用 TLS 协议保护。给出的处理方案是:在连接中通过 ServerRSAPublicKeyFile 指定服务器的 RSA 公钥,或者AllowPublicKeyRetrieval=True参数以允许客户端从服务器获取公钥。
所以我也尝试在连接后面添加了 allowPublicKeyRetrieval=true
但是并没有解决了问题。。。。。
问题解决方案:
在知道是由于MySQL认证方式导致的该问题出现的原因后,我又查了一下相关信息,大致知道了问题所在,由于docker 在拉取镜像时没有指定版本的话默认是拉取最新版本。
而MySQL在版本8.0之后默认的认证方式都更改为了caching_sha2_password,而我们服务并没有配置sha2相关的插件,所以服务启动时报错。而网上比较流行的解决方式就是改为之前的认证方式:
1、启动MySQL容器
docker start mysql
2、进入容器内部
docker exec -it mysql /bin/bash
3、登录mysql
mysql -u root -p
4、选择要使用的数据库
use mysql
5、查看plugin设置
select host, user, plugin from user;
可以看到root的plugin是caching_sha2_password,我们希望改成mysql_native_password
而这里总共有两个root,一个代表的是远程连接,一个是本地连接,所以根据自己需求修改。
5、修改认证方式
本地:ALTER USER root@localhost IDENTIFIED WITH mysql_native_password BY ‘密码’;
远程:ALTER USER ‘root’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘密码’;
- 刷新权限
FLUSH PRIVILEGES;
6、退出,重启服务