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 公钥,窃取用户密码。

相关推荐
怣501 天前
MySQL表的数据检索:从基础到精通
数据库·sql·mysql
毕设十刻1 天前
基于Vue的餐厅收银系统s6150(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
曾经的三心草1 天前
redis-6-java客户端
java·数据库·redis
大模型玩家七七1 天前
证据不足 vs 证据冲突:哪个对模型更致命
数据库·人工智能·pytorch·深度学习·安全
Traced back1 天前
SQL Server数据自动清理系统最终版(C# WinForms完整源码)
数据库·c#·.net
鸽芷咕1 天前
KingbaseES 统计信息深度调优:从自动收集到扩展统计,精准提升计划质量
数据库·mysql·性能优化·kingbasees·金仓数据库
-XWB-1 天前
【Oracle】Oracle诊断系列(3/6):性能瓶颈定位——从SQL到I/O的全面分析
数据库·sql·oracle
2501_907136821 天前
批量重命名工具 Double12 Renamer -可正则、翻译
数据库·redis·缓存
猿小羽1 天前
Spring Boot 2 + Flyway 最佳实践:多数据库配置与迁移规范
spring boot·mysql·postgresql·oracle·flyway·sql server·数据库迁移
xuefuhe1 天前
postgresql xmin xmax cmin cmax ctid
大数据·数据库