当前位置: 首页 > article >正文

记录一次MySQL:caching_sha2_password报错

一个报错

在使用客户端登录 MySQL8.0 时,我们经常会遇到下面这个报错:

ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires
secure connection

网络上很多帖子教我们将用户认证插件修改成 mysql_native_password 来解决,那么事实上这是怎么一回事呢?本文就来探讨一二。

caching_sha2_password 简介

caching_sha2_password 是 MySQL 8.0.4 引入的一个新的身份验证插件,它的特点从其命名就可以窥探出一二:

  • sha2_password:其实就是 sha256_password,这是 MySQL5.6 就引入的身份验证插件,其优点是对加盐密码进行多轮 SHA256 哈希,以确保哈希转换更安全。其缺点为它要求使用安全连接或使用RSA 密钥对进行密码交换的未加密连接,因此其身份验证的效率较低。
  • 如果是非 SSL 加密连接,则在连接建立时客户端使用 MySQL Server 端的 RSA 公钥加密用户密
    码,Server 端使用 RSA 私钥解密验证密码的正确性,可以防止密码在网络传输时被窥探

注意:SSL 加密连接会不止会加密用户密码,还会加密数据(SQL 请求、返回的结果);非加密连接只使用 RSA 密钥对进行用户密码的加密。

未加密连接是怎么使用 RSA 密钥对进行密码交换的?

当用户验证成功后,会把用户密码哈希缓存起来。新连接客户端发起登录请求时,MySQL Server 端会判断是否命中缓存,如果没有缓存,对于未加密的连接,caching_sha2_password 插件要求连接建立时使用RSA 进行加密密码交换,否则报错,其过程为:

  1. 客户端如果拥有服务端的 RSA 公钥,则使用 --server-public-key-path 选项指定 RSA 公钥文件;
  2. 客户端使用 RSA 公钥对用户密码进行加密,请求连接;
  3. 服务端使用 RSA 私钥进行解密,验证密码的正确性。

如果客户端没有保存服务端的 RSA 公钥文件,也可以使用 --get-server-public-key 选项从服务器请求公钥,则在建立连接时,服务端会先将 RSA 公钥发送给客户端。

如果 --server-public-key-path、--get-server-public-key 都没有指定,则会报下面这个经典的错误

[root@172-16-21-5 ~] mysql -h172.16.21.4 -utest -ptestpass --ssl-mode=disable
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authe
ntication requires secure connection.

指定 --get-server-public-key 则能成功登录:

[root@172-16-21-5 ~] mysql -h172.16.21.4 -utest -ptestpass --ssl-mode=disable --getserver-public-key -e "select 1"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---+
| 1 |
+---+
| 1 |

如果 test 用户登陆成功,有了缓存,则下次认证时未加密连接不再要求使用 RSA 密钥对:

[root@172-16-21-5 ~] mysql -h172.16.21.4 -utest -ptestpass --ssl-mode=disable -
e "select 1"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---+
| 1 |
+---+
| 1 |
+---+

注意:上述客户端是指 mysql 默认命令行客户端,–server-public-key-path、–get-server-public-key 参数也只适用于 mysql 客户端


http://www.kler.cn/a/474222.html

相关文章:

  • Sql 创建用户
  • kubernetes第五天
  • ADO.NET知识总结3---SqlCommand命令对象
  • 使用WPF在C#中制作下载按钮
  • 009:传统计算机视觉之边缘检测
  • 【Axios使用手册】如何使用axios向后端发送请求并进行数据交互
  • Linux中增加swap分区
  • 比QT更高效的一款开源嵌入式图形工具EGT-Ensemble Graphics Toolkit
  • 【gRPC】对称与非对称加解密和单向TLS与双向TLS讲解与go案例
  • vue 点击按钮复制文本功能(同时解决http不安全问题)
  • c# readonly 和 const的区别和使用场景
  • Android配件应用默认启动与USB权限申请区别
  • CODESYS MODBUS TCP通信(禾川Q1 PLC作为MODBUS TCP从站)
  • 【mysql】流程控制
  • 【前端,TypeScript】TypeScript速成(八):Promise
  • 机器学习的组成
  • PDFMathTranslate: Star13.8k,一款基于AI的PDF文档全文双语翻译PDF文档全文双语翻译,保留格式神器,你应该需要它
  • R语言的语法
  • 《鸿蒙系统AI技术:筑牢复杂网络环境下的安全防线》
  • 模型评估指标总结(预测指标、分类指标、回归指标)
  • 【开源免费】基于Vue和SpringBoot的贸易行业crm系统(附论文)
  • TVbox 手机、智能电视节目一网打尽
  • HarmonyOS Next系列之华为账号一键登录功能实现(十四)
  • 【MySQL】九、表的内外连接
  • C# 实现 gRPC 进程间通讯:两台设备的数据交换之道
  • 前端笔记:获取leetcode题目