问题描述

我把网站迁移到1panel中后无法访问报错:

The server requested authentication method unknown to the client

报错的内容翻译就是:服务器请求使用的是客户端未知的身份验证方法。

我的运行环境

php 7.2
mysql 8.4.3

问题分析

迁移后mysql配置hostname 从127.0.0.1改为mysql(因为mysql8是容器化的,只能以名称连接)。正是这个连接方式导致了问题。

在 MySQL 8.0 版本中,默认的身份验证插件是 caching_sha2_password;而在 MySQL 5.7 版本则为mysql_native_password。我迁移之前的数据库就是mysql5.7。

php7.2并不支持caching_sha2_password,要升级到PHP8才开始支持。

MySQL 目前使用的身份验证插件有三种,分别是 mysql_native_passwordsha256_passwordcaching_sha2_password

  • mysql_native_password:使用新的SHA1哈希算法进行认证校验。通过SHA1(SHA1(password))两次哈希计算用户的原始密码然后保存在表mysql.userauthentication_string列中。(SHA1哈希算法现在已变得比较容易破解、相同的密码拥有相同的哈希值)
  • sha256_password:实现基本的SHA-256身份验证。(加密方式比 mysql_native_password更安全,但认证过程中的时间更长 )
  • caching_sha2_password:哈希算法升级为了更为安全SHA256算法,并在服务器端使用缓存以获得更好的性能,并具有其他功能以提高适用性。(更安全的密码加密和更好的性能)

可以使用以下方式查看当前你的 MySQL 使用的是哪个身份验证插件。

方法一:(查看默认值)

mysql> show variables like 'default_authentication_plugin';
+-------------------------------+-----------------------+
| Variable_name                 | Value                 |
+-------------------------------+-----------------------+
| default_authentication_plugin | caching_sha2_password |
+-------------------------------+-----------------------+
1 row in set (0.00 sec)

方法二:(查看用户与身份验证插件)

mysql> select user,host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
4 rows in set (0.00 sec)

解决方案

升级PHP到8.0以上

这个方案我无法使用,老项目升级到PHP8几乎无法运行,只能采用下面的方案。

修改MYSQL默认身份认证方式为PHP支持的mysql_native_password

在mysql终端中运行:

ALTER USER '用户名'@'%' IDENTIFIED WITH sha256_password BY '密码';

注意替换用户名和密码为自己的,即可修改。

后记

由于mysql_native_password认证方式相对不安全,建议尽可能采用caching_sha2_password方式认证。

PHP尽可能升级到PHP8以上即可支持。