php - 使用 sha256_password(访问被拒绝)时如何使用 PHP 的 mysqli 连接到 MySQL

标签 php mysql ssl mysqli sha256

我使用的是 MySQL 5.7.24 和 PHP 7.2.10。 MySQL 配置了 SSL。我有一个用户 my_user,密码为 abc123。我尝试使用两个身份验证插件进行配置:

ALTER USER 'my_user'@'192.168.192.150' IDENTIFIED WITH sha256_password BY 'abc123';
ALTER USER 'my_user'@'192.168.192.150' IDENTIFIED WITH mysql_native_password BY 'abc123';

在我的 PHP 服务器上,我可以使用 mysql 命令行客户端成功连接,无需指定主机、用户和密码以外的任何内容。但是,在 PHP 中,我只能在使用 mysql_native_password 时连接。不是在使用 sha256_password 时。

以下 PHP 代码适用于 mysql_native_password:

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);

$con = $mysqli->real_connect('192.168.192.100', 'my_user', 'abc123', 'my_db', 
3306, null, MYSQLI_CLIENT_SSL | MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT);
var_dump($mysqli->query('SELECT 1;'));

但是,当我使用 sha256_password 时,出现错误“用户 'my_user'@'192.168.192.150' 的访问被拒绝(使用密码:YES)。”我已经尝试交替添加以下两个语句(在 real_connect 之前)但没有成功(但是,我想补充一点,我不需要其中任何一个,因为我可以连接命令行客户端无需指定这些选项*)。

$mysqli->ssl_set(null, null, 'ca.pem', null, null);
$mysqli->ssl_set('client-key.pem', 'client-cert.pem', 'ca.pem', null, null);

那么应该如何在 PHP 中使用 mysqli 中的 sha256_password

*注意:我的 PHP 服务器与我的 MySQL 服务器是不同的机器。在包含ssl-cassl-certssl-key的PHP服务器上没有my.cnf 选项,所以我真的尝试可以在没有它们的情况下使用 mysql 进行连接。

更新 1

如果有帮助,这里有一些来自 phpinfo 的诊断信息:

mysqli

MysqlI Support => enabled
Client API library version => mysqlnd 5.0.12-dev - 20150407 - $Id: 38fea24f2847fa7519001be390c98ae0acafe387 $
Active Persistent Links => 0
Inactive Persistent Links => 0
Active Links => 0

Directive => Local Value => Master Value
mysqli.allow_local_infile => On => On
mysqli.allow_persistent => On => On
mysqli.default_host => no value => no value
mysqli.default_port => 3306 => 3306
mysqli.default_pw => no value => no value
mysqli.default_socket => no value => no value
mysqli.default_user => no value => no value
mysqli.max_links => Unlimited => Unlimited
mysqli.max_persistent => Unlimited => Unlimited
mysqli.reconnect => Off => Off
mysqli.rollback_on_cached_plink => Off => Off

mysqlnd

mysqlnd => enabled
Version => mysqlnd 5.0.12-dev - 20150407 - $Id: 38fea24f2847fa7519001be390c98ae0acafe387 $
Compression => supported
core SSL => supported
extended SSL => supported
Command buffer size => 4096
Read buffer size => 32768
Read timeout => 86400
Collecting statistics => Yes
Collecting memory statistics => No
Tracing => n/a
Loaded plugins => mysqlnd,debug_trace,auth_plugin_mysql_native_password,auth_plugin_mysql_clear_password,auth_plugin_caching_sha2_password,auth_plugin_sha256_password
API Extensions => mysqli,pdo_mysql

openssl

OpenSSL support => enabled
OpenSSL Library Version => OpenSSL 1.1.0g  2 Nov 2017
OpenSSL Header Version => OpenSSL 1.1.0g  2 Nov 2017
Openssl default config => /usr/lib/ssl/openssl.cnf

Directive => Local Value => Master Value
openssl.cafile => no value => no value
openssl.capath => no value => no value

最佳答案

据我从文档中了解到,一次只能激活一个 auth_option。

所以当你在做的时候

ALTER USER 'my_user'@'192.168.192.150' IDENTIFIED WITH sha256_password BY 'abc123';
ALTER USER 'my_user'@'192.168.192.150' IDENTIFIED WITH mysql_native_password BY 'abc123';

你的第二个请求实际上将 sha256_password auth 重新定义为 mysql_native_password

关于php - 使用 sha256_password(访问被拒绝)时如何使用 PHP 的 mysqli 连接到 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54177511/

相关文章:

php - 如何在一个表中查找不在其他表中的行

php - 如何通过 git 推送 laravel 包和帮助文件

MyISAM 的 MySQL my.cnf 配置设置

mysql - spring、mysql、mybatis测试

python - 如何在 python 2.7 中安装 pem 模块?

php - 字段列表中的列 'id' 在 PHP 中不明确

javascript - 如何根据 onclick 函数获取两个输入字段值

mysql - 如何根据输入数据显示 future 30 天的记录?

java - TitaniumStudio 工作室登录错误?

r - 在 R 中使用 httr 通过 SSL 获取网站内容