MySQL抛出的Public Key Retrieval is not allowed

有时候在连接实例的时候会遇到这样的报错Public Key Retrieval is not allowed

问题分析

这是因为账号使用了sha256_password或者caching_sha2_password 密码插件

而sha256_password或者caching_sha2_password 插件为了加快认证过程,在服务端维护了一个密码哈希缓存。当客户端发起连接时:

  • 如果用户的密码哈希已经被缓存,服务端可以直接验证,无需客户端发送明文密码进行验证。
  • 如果缓存中没有该用户的密码哈希,则客户端需要发送明文密码进行认证。

在发送明文密码时,出于安全考虑,MySQL 要求:

  • 要么客户端和服务端之间建立 SSL 加密连接。
  • 要么客户端允许通过服务端公钥加密明文密码。

如果两者都不满足,就会抛出 Public Key Retrieval is not allowed 错误。

以下三种情况会导致缓存中没有用户的密码哈希

  • 发生重启
  • 发生HA
  • 有操作flush privileges

解决方法

1、客户端的话可以设置驱动中的allowPublicKeyRetrieval=true

2、JDBC的话可以在连接字符串中添加allowPublicKeyRetrieval=true参数,以允许公钥检索。

复制代码
jdbc:mysql://localhost:3306/?allowPublicKeyRetrieval=true

3、将账号的密码插件改为mysql_native_password

注意事项

设置allowPublicKeyRetrieval=true的方法会自动从 MySQL 服务端获取 RSA 公钥,但这种方法有一定的安全风险,可能会受到中间人攻击。攻击者可以伪造 RSA 公钥,窃取用户密码。

相关推荐
2301_780789664 小时前
渗透测试与网络安全审计的关系
网络·数据库·安全·web安全·网络安全
罗光记4 小时前
Karmada v1.15 版本发布
数据库·百度·facebook·oneapi·segmentfault
小蒜学长4 小时前
spring boot驴友结伴游网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
Lilixxs4 小时前
VBA 中使用 ADODB 操作 SQLite 插入中文乱码问题
数据库·中间件·sqlite·乱码·vba·odbc·adodb
Hx__5 小时前
MySQL InnoDB 的锁机制
数据库·mysql
liweiweili1265 小时前
数据库中事务、指令、写法解读
jvm·数据库
edjxj5 小时前
Qt添加图标资源
开发语言·数据库·qt
阿华的代码王国5 小时前
【Android】Room数据库的使用
android·数据库·room
Techer_Y5 小时前
云数据库服务(参考自腾讯云计算工程师认证课程)更新中......
数据库