当前位置:首页 > 问答 > 正文

MySQL远程连接出错,提示ER_AUTH_CANT_WRITE_PUBKEY,怎么修复这故障啊

当你尝试从一台机器远程连接到另一台机器上的MySQL数据库时,如果突然弹出一个错误提示“ER_AUTH_CANT_WRITE_PUBKEY”,这确实会让人感到困惑和着急,这个错误的核心问题,通常不是出在你的SQL语句或者网络配置上,而是与MySQL 8.0版本引入的一种更安全的密码加密方式有关,下面我们来详细拆解这个问题,并提供一步步的解决方法。

这个错误到底是什么意思?

这个错误提示翻译成大白话就是:“客户端无法写入公钥文件”,这需要从MySQL的密码验证方式讲起。

在MySQL 8.0之前,默认使用一种叫做“mysql_native_password”的密码验证插件,这种方式虽然简单,但安全性相对较低,为了提升安全性,MySQL 8.0将默认的验证插件改为了“caching_sha2_password”,这个新的插件在身份验证过程中,需要用到RSA公钥加密技术。

当你作为客户端,尝试用“caching_sha2_password”方式去连接服务器时,会发生两件事:

  1. 请求公钥:客户端会向MySQL服务器请求一个RSA公钥。
  2. 保存公钥:客户端在收到这个公钥后,会尝试将它保存到本地的一个文件里,以便后续的加密通信使用。

而“ER_AUTH_CANT_WRITE_PUBKEY”这个错误,就发生在第二步,你的客户端程序(比如你用的MySQL Workbench、Navicat,或者命令行工具)没有足够的权限在你自己的电脑上创建或写入那个用来保存公钥的文件。

为什么会出现这个问题?

这个问题最常见于Windows操作系统下的某些客户端环境,主要原因有以下几点:

  1. 客户端软件权限不足:如果你不是以“管理员身份”运行你的MySQL客户端工具(没有右键点击MySQL Workbench图标选择“以管理员身份运行”),那么该程序可能没有权限在你的用户目录下创建必要的文件。
  2. 指定的公钥文件路径有问题:在某些连接配置中,你可以手动指定一个路径来存放这个公钥文件,如果你指定的路径不存在,或者客户端对该路径没有写权限,也会导致失败。
  3. 客户端版本过旧:非常老的MySQL客户端库(比如一些旧版本的Connector/J、Connector/Python等)可能对新的“caching_sha2_password”认证方式支持不完善,在处理公钥时会发生错误。

如何修复这个故障?

这里有几种方法,你可以从最简单、最安全的方法开始尝试。

MySQL远程连接出错,提示ER_AUTH_CANT_WRITE_PUBKEY,怎么修复这故障啊

最直接的修复——在连接命令中禁用公钥检索(推荐尝试)

这是最快、最直接的解决方法,你可以在连接数据库的命令行或者客户端的高级设置里,明确告诉MySQL客户端:“不要尝试从服务器请求公钥了”。

  • 如果你是使用命令行连接,在命令中加入 --get-server-public-key=false 这个参数。
    • mysql -h 你的服务器地址 -u 用户名 -p --get-server-public-key=false
  • 如果你是使用图形化工具(如MySQL Workbench、Navicat)
    • 找到连接设置或高级设置(Advanced)标签页。
    • 在“Others”或“连接参数”区域,添加一个参数:键(Key)为 get-server-public-key,值(Value)为 false
    • 或者在“SSL”标签页附近,寻找类似“允许公钥检索(Allow Public Key Retrieval)”的选项,并将其设置为 True 或勾选上(不同工具表述可能略有不同,但功能一致)。

这个方法相当于绕开了导致错误的那一步,在很多情况下能立即解决问题。

更根本的解决——更改MySQL用户的密码验证插件

如果方法一不奏效,或者你希望有一个更一劳永逸的解决方案,你可以考虑在MySQL服务器端,将你的用户账号的认证方式改回旧的模式。这种方法会降低连接的安全性,请确保你的网络环境是可信的(例如使用VPN或内部网络)。

MySQL远程连接出错,提示ER_AUTH_CANT_WRITE_PUBKEY,怎么修复这故障啊

你需要能够登录到MySQL服务器(比如通过本地命令行或者已有能正常工作的远程连接),然后执行以下SQL命令:

ALTER USER '你的用户名'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;

这条命令的意思是:将用户‘你的用户名’(请替换为实际的用户名)的认证插件修改为旧的“mysql_native_password”,并设置密码,执行后,该用户再次连接时就不会再使用需要RSA公钥的新方式了,因此也就不会出现公钥写入错误。

检查并修复客户端环境

如果上述方法都无效,问题可能出在你的客户端电脑环境上。

  • 以管理员身份运行:确保你总是以“管理员身份”运行你的客户端软件。
  • 检查客户端版本:尝试将你的MySQL客户端工具或连接驱动更新到最新版本,以确保其对MySQL 8.0的特性有最好的兼容性。

总结一下

遇到“ER_AUTH_CANT_WRITE_PUBKEY”错误时,不要慌张,它主要是因为新版的MySQL采用了更安全的密码机制,而你的客户端在配合这个机制时遇到了权限或兼容性问题,你的解决路径应该是:

  1. 首先尝试在连接参数中设置 get-server-public-key=false
  2. 如果不行,且对安全性要求不是极致苛刻,可以考虑将用户认证方式改为 mysql_native_password
  3. 检查客户端软件的运行权限和版本。

第一种方法就能解决绝大多数情况下的问题,希望这些步骤能帮助你顺利恢复远程连接。