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

相关推荐
做运维的阿瑞6 分钟前
mysql数据库视图笔记:创建、修改、删除与适用场景
数据库·笔记·mysql
Seraphina3615 分钟前
DVWA(SQL Injection-High,XSS Reflected-Medium,XSS Stored-Medium)
数据库·经验分享·sql·网络安全·xss
@Mike@16 分钟前
12-数据库学习笔记(五种连接算法)
数据库·笔记·学习
Omics Pro28 分钟前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理
龙亘川33 分钟前
探索智慧文化服务:建设初衷、整体架构、技术支撑、发展现状与实践影响
大数据·数据库·架构
风早爽太37 分钟前
Python 学习笔记:数据库迁移工具 ‌Alembic
数据库·python·fastapi·alembic
java1234_小锋1 小时前
【技术专题】Mysql8 数据库 - Mysql8 数据库基本操作
数据库·mysql
其实防守也摸鱼1 小时前
DeepSeek Harness 开源贡献手记:从 Issue 到 Merge 的完整旅程
android·数据库·学习·ai·oracle·自动化
专业程序开发源1 小时前
springboot生命故事书制作小程序65290-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·小程序·课程设计
jason.zeng@15022072 小时前
canal做mysql的异步传输工具
数据库·mysql·linq