MySQL 8.0的Public Key Retrival问题解决

一、导致“Public Key Retrieval is not allowed”原因

该错误是在 JDBC 与 MySQL 建立 Connection 对象时出现的;需要明确的是出现该问题的时候,MySQL 配置的密码认证插件为如下两种:

  • sha256_password
  • caching_sha2_password

使用“mysql_native_password”密码认证插件,不会出现“Public Key Retrieval is not allowed”错误。

注:MySQL 8.0 默认推荐使用“sha256_password”和“caching_sha2_password”这两种认证插件。只有较老的 MySQL 版本仍然会使用“mysql_native_password”。

根据 MySQL 提供的官方文档(https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html),这两种插件都是使用 SHA256 算法来对密码进行保护。这些插件的具体执行流程如下:

  1. 检查客户端是否禁用 SSL/TLS 加密传输;
  2. 如果客户端未禁用 SSL/TLS 加密传输,则客户端在进行认证时的认证报文(传输用户名和密码的报文)是使用 TLS 进行传输的,两种插件认为认证报文传输安全,不进行任何其他操作;
  3. 如果客户端禁用 SSL/TLS 加密传输,则客户端在进行认证时的认证报文(传输用户名和密码的报文)是使用明文进行传输的,两种插件认为认证报文传输不安全,会单独对明文报文中的密码使用 RSA 加密方式进行加密。

二、针对上述错误,有如下的解决方案

根据前面的分析,导致“Public Key Retrieval is not allowed”主要是由于当禁用 SSL/TLS 协议传输后,客户端会使用服务器的公钥进行传输,默认情况下客户端不会主动去找服务器拿公钥,此时就会出现上述错误。

经过查阅官方文档,出现 Public Key Retrieval 的场景可以概括为在禁用 SSL/TLS 协议传输切当前用户在服务器端没有登录缓存的情况下,客户端没有办法拿到服务器的公钥。具体的场景如下:

  1. 新建数据库用户,首次登录;
  2. 数据库的用户名、密码发生改变后登录;
  3. 服务器端调用 FLUSH PRIVELEGES 指令刷新服务器缓存。

针对上述错误,有如下的解决方案:

  1. 在条件允许的情况下,不要禁用 SSL/TLS 协议,即不要在 CLI 客户端使用--ssl-mode=disabled,或在 JDBC 连接串中加入 useSSL=false;
  2. 如果必须禁用 SSL/TLS 协议,则可以尝试使用 CLI 客户端登录一次 MySQL 数据库制造登录缓存;
  3. 如果必须禁用 SSL/TLS 协议,则可以通过增加如下参数允许客户端获得服务器的公钥:
  • 在 JDBC 连接串中加入 allowPublicKeyRetrieval=true 参数;
  • 在 CLI 客户端连接时加入--get-server-public-key 参数;
  • 在 CLI 客户端连接时加入--server-public-key-path=file_name 参数,指定存放在本地的公钥文件。

最后,想说的是:我PC的dbeaver客户端,驱动属性配置了useSSL=true,却也遇到“Public Key Retrieval is not allowed”。Why?母鸡!但是在 JDBC 连接串中加入 allowPublicKeyRetrieval=true 参数之后就可以了。

三、MySQL认证插件简述

MySQL 提供了多种认证插件,如上图支持13种插件;每种插件都有其特定的用途和优缺点。以下是三种常见的认证插件:sha256_passwordmysql_native_passwordcaching_sha2_password 的简介及各自的优缺点。

1. mysql_native_password

简介

  • mysql_native_password 是 MySQL 最早的认证插件,也是默认的认证插件。
  • 它使用基于 SHA-1 的散列算法进行认证。
  • 客户端和服务器之间使用散列值进行双向认证。

优点

  • 兼容性:广泛支持,几乎所有 MySQL 客户端和应用程序都支持这种认证方式。
  • 性能:认证过程简单,性能较高。

缺点

  • 安全性:SHA-1 散列算法被认为不再安全,容易受到碰撞攻击。
  • 明文传输:在不安全的网络环境中,密码可能会以明文形式传输,存在安全隐患。

2. sha256_password

简介

  • sha256_password 使用 SHA-256 散列算法进行认证。
  • 它提供了更高的安全性,但需要客户端和服务器之间进行更多的交互。
  • 支持 SSL/TLS 加密,确保密码在传输过程中不被窃取。

优点

  • 安全性:SHA-256 散列算法比 SHA-1 更安全,更难被破解。
  • 加密传输:支持 SSL/TLS 加密,确保密码在传输过程中的安全性。

缺点

  • 性能:认证过程复杂,性能较低,特别是在高并发环境下。
  • 兼容性:不是所有客户端和应用程序都支持 sha256_password,需要确保客户端支持该认证方式。
  • 配置复杂:需要配置 SSL/TLS 证书,增加了管理和配置的复杂性。

3. caching_sha2_password

简介

  • caching_sha2_password 是 MySQL 8.0 引入的新认证插件。
  • 它结合了 mysql_native_password 和 sha256_password 的优点,提供高性能和高安全性。
  • 在首次认证时使用 SHA-256 散列算法,之后将认证信息缓存起来,以提高后续认证的性能。

优点

  • 安全性:使用 SHA-256 散列算法,提供高安全性。
  • 性能:通过缓存认证信息,提高了后续认证的性能。
  • 兼容性:广泛支持,大多数现代客户端和应用程序都支持 caching_sha2_password

缺点

  • 配置复杂:需要配置 SSL/TLS 证书,增加了管理和配置的复杂性。
  • 缓存风险:虽然缓存提高了性能,但也引入了一定的安全风险,需要确保缓存机制的安全性。

总结

  • mysql_native_password:适合需要高性能和广泛兼容性的场景,但安全性较低。
  • sha256_password:适合需要高安全性的场景,但性能较低,配置复杂。
  • caching_sha2_password:结合了高性能和高安全性,适合大多数现代应用场景,但需要配置 SSL/TLS 证书。

选择合适的认证插件时,需要根据具体的应用需求和环境来权衡性能、安全性和兼容性。

深度搜索

原文参考:

1、https://www.cnblogs.com/hungryquiter/p/16967443.html

2、https://cloud.tencent.com/developer/news/791903

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 集合遍历中删除元素的正确方法与陷阱

在 Java 开发中,经常会遇到遍历集合并删除特定元素的需求。乍一看,这似乎是一个简单的操作,但如果不注意方式,很容易踩坑。这篇文章将带你理解如何在 Java 中安全地删除集合元素,并避免 ConcurrentModificationExcepti…

sed超实用的文本处理工具

sed命令参数表 sed参数说明a在指定行的后面增加新航c替换指定行d删除行-e多次编辑,多次编辑后这样写回文件。sed -i -e /^[[:space:]]*#/d -e /^$/d nginx.confp打印行-r激活拓展正则-n取消默认输出-i静默编辑,屏幕上不显示编辑后的内容,放在…

GPU 环境搭建指南:如何在裸机、Docker、K8s 等环境中使用 GPU

本文主要分享在不同环境,例如裸机、Docker 和 Kubernetes 等环境中如何使用 GPU。 跳转阅读原文:GPU 环境搭建指南:如何在裸机、Docker、K8s 等环境中使用 GPU 1. 概述 仅以比较常见的 NVIDIA GPU 举例,系统为 Linux,…

MySQL-表数据操作

目录 一、INSERT-增加表中数据 二、DELETE-删除表中数据 三、UPDATE-修改表中数据 四、SELECT-查询表中数据 1、select基础查询 1.1 结果去重查询-DISTINCT 1.2 使用别名查询-AS 1.3 计算列 2、选择查询 2.1 比较搜索条件 2.2 范围搜索条件-BETWEEN AND 2.3 列表搜…

Vue中父组件通过v-model向子组件传对象参数

描述&#xff1a; Vue中父组件通过v-model向子组件传递一个对象&#xff0c;在子组件实现一个能够对object key-value进行编辑的组件封装。 父组件文件 <form-child v-model"configMap"></form-child>import formChild from /components/formchild.vue i…

mysql数据同步到sql server

准备工作 下载安装sql server express 2019 现在安装SSMS(连接数据库GUI) 安装ssms for mysql 需要注意的是在上面的步骤中首先需要根据指导安装mysql ODBC 设置express sa用户密码登录 --change password for login user "sa"Security > Logins > sa (rig…

如何解决企业业务流程分散的痛点

企业面临的一个普遍问题是业务流程的分散。业务流程分散不仅使得工作效率大幅下降&#xff0c;还增加了出错的风险&#xff0c;影响了企业的整体运营效率。因此&#xff0c;解决这一问题成为了许多企业亟需面对的挑战。 业务流程分散的原因 业务流程分散的根本原因&#xff0…

融入模糊规则的宽度神经网络结构

融入模糊规则的宽度神经网络结构 论文概述创新点及贡献 算法流程讲解模糊规则生成映射节点生成输出预测结果 核心代码复现main.py文件FBLS.py文件 使用方法测试结果示例&#xff1a;使用公开数据集进行本地训练准备数据数据输入模型进行训练实验结果 环境配置资源获取 本文所涉…

SQL常见语法

select * from student; select&#xff1a;选取 from&#xff1a;来源 *&#xff1a;所有栏位 select 姓名&#xff0c;班级&#xff0c;成绩 from students; 选取特定栏位 select 姓名&#xff0c;班级&#xff0c;成绩 from students limit 5;--限制显示拦数 select 姓…

Kafka Eagle 安装教程

目录 前言 一、安装前的准备 1. 系统要求 2. 安装 JDK 3. 安装 Kafka 和 Zookeeper 4. MySQL 环境准备 二、下载并安装 Kafka Eagle 三、配置 Kafka Eagle 1. 编辑配置文件 2. 配置 Kafka 和 Zookeeper 信息 四、启动 Kafka Eagle 五、访问 Kafka Eagle 六、测试功…

贪心算法-汽车加油

这道题目描述了一个汽车旅行场景&#xff0c;需要设计一个有效的算法来决定在哪几个加油站停车加油&#xff0c;以便最小化加油次数。题目给出了汽车加满油后的行驶距离n公里&#xff0c;以及沿途若干个加油站的位置。我们需要找出一个方案&#xff0c;使得汽车能够完成整个旅程…

yarn报错`warning ..\..\package.json: No license field`:已解决

出现这个报错有两个原因 1、项目中没有配置许可证 在项目根目录package.json添加 {"name": "next-starter","version": "1.0.0",# 添加这一行"license": "MIT", }或者配置私有防止发布到外部仓库 {"priv…

Vue Cli的配置中configureWebpack和chainWebpack的主要作用及区别是什么?

直接区别&#xff1a; configureWebpack项直接覆盖同名配置&#xff1b;chainWebpack项直接修改默认配置。 configureWebpack配置&#xff1a; // vue.config.js module.exports {configureWebpack: {plugins: [new MyAwesomeWebpackPlugin()]} }该代码段中的对象将会被web…

【电子通识】TINA-TI中仿真波形如何配置自动分离曲线?

在实际的TIAN-TI使用中,我们仿真后,输出的波形一般都是叠加的形式输出的。比如下图所示: 有一些更多条曲线且曲线内容不同的仿真,叠加后会更让我们看不清。导致很不方便。 一般这时我们会 选择View->Separate outputs( 分开输出),就可以将不同波形分…

【数据结构】线性表——顺序表

文章目录 一、线性表二、顺序表2.1概念及结构2.2、顺序表接口实现2.2.1、顺序表的动态存储2.2.2、顺序表初始化2.2.3、检查空间判断进行增容2.2.4、顺序表尾插、尾删2.2.5、顺序表头插、头删2.2.6、顺序表查找2.2.7、顺序表在pos位置插入x2.2.8、顺序表删除pos位置的值2.2.9、顺…

Javascript高级—深浅拷贝

浅拷贝 浅拷贝是拷贝第一层的拷贝 使用Object.assign解决这个问题。 let a {age: 1 } let b Object.assign({}, a) a.age 2 console.log(b.age) // 1通过展开运算符 ... 来实现浅拷贝 let a {age: 1 } let b {...a}; a.age 2; console.log(b.age) // 1深拷贝 简单的…

【Matlab算法】MATLAB实现基于小波变换的信号去噪(附MATLAB完整代码)

MATLAB实现基于小波变换的信号去噪 结果图前言正文1. 小波变换理论基础1.1 小波变换的数学模型1.2 离散小波变换原理2. 信号去噪方法2.1 去噪算法流程2.2 阈值处理方法3. 核心函数解析3.1 wavedec函数3.2 wthresh函数代码实现4.1 信号生成4.2 小波变换去噪完整代码总结参考文献…

(十)Python字典基本操作

与列表和元组有所不同&#xff0c;字典是另一种可变容器模型&#xff0c;且可存储任意类型的对象。 一、字典对象常用操作 字典的对象使用大括号{}将元素列出。字典的元素排列并没有一定的顺序&#xff0c;因为可以使用键值来取得该元素。 hh{"名称":"葡萄&q…

神经网络基础--什么是正向传播??什么是方向传播??

前言 本专栏更新神经网络的一些基础知识&#xff1b;这个是本人初学神经网络做的笔记&#xff0c;仅仅堆正向传播、方向传播进行了讲解&#xff0c;更加系统的讲解&#xff0c;本人后面会更新《李沐动手学习深度学习》&#xff0c;会更有详细讲解;案例代码基于pytorch&#xf…

Oracle RAC的thread

参考文档&#xff1a; Real Application Clusters Administration and Deployment Guide 3 Administering Database Instances and Cluster Databases Initialization Parameter Use in Oracle RAC Table 3-3 Initialization Parameters Specific to Oracle RAC THREAD Sp…