问题描述
我把网站迁移到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_password、sha256_password 和 caching_sha2_password。
mysql_native_password:使用新的SHA1哈希算法进行认证校验。通过SHA1(SHA1(password))两次哈希计算用户的原始密码然后保存在表mysql.user的authentication_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以上即可支持。