首页 文章

SSL保护的PDO连接无法正常工作 - SQLSTATE SSL错误 - 用户拒绝访问(使用密码:YES)

提问于
浏览
3

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

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

如果我尝试连接 via CLI on a client machine everything just works great .

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     |
    | ...                            | ...                    |
    +--------------------------------+------------------------+

if I use PHP (PHP/5.4.9-4ubuntu2.3) with PDO to connect to the database, the connection is not working . 我试过php5-mysql驱动程序,我尝试了php5-mysqlnd(Native Driver) . 两者都不会改变一件事 .

<?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

If I disable SSL 由"not requireing"在fba_user上, the connection with PDO just works fine . 我认为这是一个错误,但也许别人可以帮忙吗?

EDIT 1 :如果我使用的是数据库root用户,那么连接正常,但是我不确定是否使用了ssl,因为查询:

SHOW STATUS LIKE "%SSL%";

确实回来了

DHE-RSA-AES256-SHA

但我认为系统正在撒谎,根本没有使用SSL安全的mysql连接 .

EDIT 2 :我嗅了一下数据包,是的,对于root用户,连接是通过SSL保护的,但是对于fba_user,情况并非如此 .

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

2 回答

  • 0

    我在帖子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支持的多个驱动程序,所以我试图解决这个问题 .

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

  • 0

    以下代码将帮助您

    PDO('mysql:host='.HOST.';dbname='.DBNAME.';charset=utf8', USER, PASSWORD, 
                    array( PDO::MYSQL_ATTR_SSL_KEY =>'/mysqlsslcertificate1/client-key.pem',
    
                           PDO::MYSQL_ATTR_SSL_CERT=>'/mysqlsslcertificate1/client-cert.pem', 
                            PDO::MYSQL_ATTR_SSL_CA =>'/mysqlsslcertificate1/ca-cert.pem' )
     );
    

相关问题