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

标签 php mysql ssl pdo

我通过 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/

相关文章:

php - 仅前缀 redis session key

mysql - 在 mysql 中用于时区的数据类型

mysql - 在多对多关系中选择同一字段的多个不同值

c# - 缺少相互证书的 Wcf 请求 wsse :Security

java - 允许非 ssl 连接 : javax.net.ssl.SSLHandshakeException: 握手失败

php - 如何仅在服务器调用 PHP 脚本时运行它

php - 用于从另一个表中的多个值查找行的 SQL 查询构造

Windows 托管错误上的 php 联系表单

mysql - 在 key 更新时选择最大合并?

子域的 SSL 影响根域安全