PHP 7.2 mysqli 无法在没有 SSL 的情况下使用身份验证插件 sha256_password 连接到 MySQL

Posted

技术标签:

【中文标题】PHP 7.2 mysqli 无法在没有 SSL 的情况下使用身份验证插件 sha256_password 连接到 MySQL【英文标题】:PHP 7.2 mysqli can not connect to MySQL with auth plugin sha256_password without SSL 【发布时间】:2020-04-12 11:17:06 【问题描述】:

mysql 中的用户身份验证插件更改为“sha256_password”:

ALTER USER 'user'@'N.N.N.N' IDENTIFIED WITH 'sha256_password' BY 'password';

test.php:

#!/usr/bin/env php
<?php
$my = new mysqli('M.M.M.M', 'user', 'password');
echo "OK\n";
$my->close();
?>

不适用于“sha256_password”:

php test.php
Warning: mysqli::__construct(): (HY000/1045): Access denied for user 'user'@'hostname' (using password: YES) in /home/user/test.php on line 3

将用户身份验证插件改回“mysql_native_password”:

ALTER USER 'user'@'N.N.N.N' IDENTIFIED WITH 'mysql_native_password' BY 'password';

将身份验证插件改回“mysql_native_password”连接后:

php test.php
OK

软件版本:

php --version
PHP 7.2.25-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Nov 28 2019 07:41:59) ( NTS )

dpkg -l | grep libmysqlclient20
ii  libmysqlclient20:amd64                5.7.28-0ubuntu0.16.04.2

mysqld -V
mysqld  Ver 5.7.26-29-57 for debian-linux-gnu on x86_64 (Percona XtraDB Cluster (GPL), Release rel29, Revision 03540a3, WSREP version 31.37, wsrep_31.37)

任何想法如何解决这个问题?

更新

我还检查了它是否适用于 python MySQLdb 连接器:

import MySQLdb
con = MySQLdb.connect(host='127.0.0.1',user='user', passwd='password')
cur = con.cursor()
cur.execute('select 1')
print(cur.fetchall())
con.close()

【问题讨论】:

不确定答案,但问题似乎与***.com/questions/54177511/… 相同(需要指示mysqli 使用sha_256。) @user3783243 你知道如何指示mysqli使用sha_256吗?我在那个问题或 mysqli 文档中找不到它。 虽然,在您的情况下,您会看到一条消息说 MySQL 无法让您登录。这通常发生在您输入用户名、密码或未授予权限时。如果是 PHP 故障,您应该会看到一条消息说客户端无法识别身份验证方法 @Dharman 我是这么认为的,但是如果身份验证插件是“mysql_native_hashing”,则相同的 php 代码可以在相同的用户和密码下正常工作。 我实际上不知道你的问题的答案。我发现了这个有用的链接:php.net/manual/en/mysqli.options.php 和 dev.mysql.com/doc/refman/5.6/en/… 【参考方案1】:

所以看起来 PHP 7.2.25(2019 年 11 月 21 日的版本)不支持对没有 SSL 的连接进行 MySQL 'sha256_password' 授权。

【讨论】:

你能在你找到的地方添加参考吗?

以上是关于PHP 7.2 mysqli 无法在没有 SSL 的情况下使用身份验证插件 sha256_password 连接到 MySQL的主要内容,如果未能解决你的问题,请参考以下文章

使用 SSL 的 PHP MySQLi 持久连接

ubuntu 16.04 上的 php 7.2 上缺少请求的 PHP 扩展 ext-mysqli *

ubuntu 16.04 上的 php 7.2 上缺少请求的 PHP 扩展 ext-mysqli *

使用PHP / MySQLI / Apache时,在哪里安全地存储证书/密钥?

PHP 在连接到 MySql 时忽略 ssl 证书

mysqli_real_connect() 获取 SSL3_GET_SERVER_CERTIFICATE:证书验证失败