gpt4 book ai didi

php - SSL 保护的 PDO 连接不起作用 - SQLSTATE SSL 错误 - 用户访问被拒绝(使用密码 : YES)

转载 作者:搜寻专家 更新时间:2023-10-31 22:05:08 24 4
gpt4 key购买 nike

我通过 MySQL Workbench 创建了一个用户。

    CREATE USER 'fba_user'@'%' IDENTIFIED BY 'my_Pa$$word';
CREATE USER 'fba_user'@'localhost' IDENTIFIED BY 'my_Pa$$word';
FLUSH PRIVILEGES;
GRANT ALL PRIVILEGES ON fallbackauthdb.* TO 'fba_user'@'%' IDENTIFIED BY 'my_Pa$$word' REQUIRE SSL;
GRANT ALL PRIVILEGES ON fallbackauthdb.* TO 'fba_user'@'localhost' IDENTIFIED BY 'my_Pa$$word' REQUIRE SSL;
FLUSH PRIVILEGES;

我通过生成所需的证书和 key 将 MySQL 服务器 (5.5.34-0ubuntu0.13.04.1) 配置为使用 SSL,并通过/etc/mysql/my.cnf 配置它们

如果我尝试在客户端计算机上通过 CLI 进行连接,一切正常

    user@ClientPC:~$ mysql -h mysql.example.com --port=3306  -v --ssl-ca=/home/user/demo/ca-cert.pem --ssl-cert=/home/user/demo/client-cert.pem --ssl-key=/home/user/demo/client-key.pem -u fba_user -p
Enter password: my_Pa$$word

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 99
Server version: 5.5.34-0ubuntu0.13.04.1 (Ubuntu)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Reading history-file /home/user/.mysql_history
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW STATUS LIKE "%SSL%";
--------------
SHOW STATUS LIKE "%SSL%"
--------------

+--------------------------------+------------------------+
| Variable_name | Value |
+--------------------------------+------------------------+
| Com_show_processlist | 0 |
| Ssl_accept_renegotiates | 0 |
| Ssl_accepts | 0 |
| Ssl_callback_cache_hits | 0 |
| Ssl_cipher | DHE-RSA-AES256-SHA |
| ... | ... |
+--------------------------------+------------------------+

但是如果我使用带有PDO 的PHP (PHP/5.4.9-4ubuntu2.3) 连接到数据库,则连接不起作用。我尝试了 php5-mysql 驱动程序和 php5-mysqlnd( native 驱动程序)。两者都不会改变任何事情。

    <?php
error_reporting(E_ALL);
ini_set("display_errors", "1");

if (!defined('PDO::ATTR_DRIVER_NAME')) {
echo 'PDO unavailable';
}
elseif (defined('PDO::ATTR_DRIVER_NAME')) {
echo 'PDO available';
}

$pdo = new PDO('mysql:host=mysql.example.com;dbname=fallbackauthdb;charset=utf8', 'fba_user', 'my_Pa$$word', array(
PDO::MYSQL_ATTR_SSL_KEY => '/etc/mysql/client-key.pem',
PDO::MYSQL_ATTR_SSL_CERT => '/etc/mysql/client-cert.pem',
PDO::MYSQL_ATTR_SSL_CA => '/etc/mysql/ca-cert.pem'
));

foreach ($pdo->query('SHOW STATUS LIKE "%Ssl%"') as $row) {
print_r($row[0] ."=". $row[1] . PHP_EOL);
}
?>

这就是我收到的错误信息:

    PDO available
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [1045] Access denied for user 'fba_user'@'mysql.example.com' (using password: YES)' in /var/www/gfa/sql.php:17 Stack trace: #0 /var/www/gfa/sql.php(17): PDO->__construct('mysql:host=mysq...', 'fba_user', 'my_Pa$$...', Array) #1 {main} thrown in /var/www/gfa/sql.php on line 17

如果我通过在 fba_user 上“不要求”它来禁用 SSL与 PDO 的连接工作正常。我认为这是一个错误,但也许其他人可以提供帮助?

编辑 1:如果我改用数据库根用户,则连接正常,但我不确定是否使用了 ssl,因为查询:

     SHOW STATUS LIKE "%SSL%";

返回

     DHE-RSA-AES256-SHA

但我认为系统在撒谎,根本没有使用 SSL 保护的 mysql 连接。

编辑 2:我嗅探了数据包,是的,对于 root 用户,连接是通过 SSL 保护的,但对于 fba_user,情况并非如此。

为什么我认为系统在撒谎?:我可以在 PHP 脚本中更改客户端证书的路径,甚至可以从系统中删除它们并重新启动服务器。连接仍然是 SSL 加密的,WTF?

最佳答案

我在帖子 Can't connect with PDO using ssl but mysqli with ssl works 遇到了同样的问题

我建议不要使用 root 用户,因为我不认为你可以强制使用 SSL 并且 PDO 会默默地失败让你认为它正在工作或者如果你已经在使用 SSL (https) 我认为数据包可以被加密。一个简单的测试是创建另一个用户,强制 ssl,尝试命令行远程连接而不是使用 PDO ssl,连接将失败/被阻止并告诉您 SSL 无法通过 PDO 工作。

无论如何,我们必须切换到 MySQLI 才能使 DB SSL 正常工作,而使用 PDO 根本不起作用。我仍在寻找诊断/调试的方法,并弄清楚为什么我们无法使用 PDO ssl 进行连接,因为这是一个问题,而且 PDO 附带了一些第三方代码,这意味着如果我们无法理解,我们就无法使用他们的代码这一点,我们确实有理由使用 PDO 支持的多个驱动程序,所以我正在尝试解决这个问题。

如果您取得了任何进展,请告诉我 :)。

关于php - SSL 保护的 PDO 连接不起作用 - SQLSTATE SSL 错误 - 用户访问被拒绝(使用密码 : YES),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20071210/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com