我通过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 回答
我在帖子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支持的多个驱动程序,所以我试图解决这个问题 .
如果你取得了任何进展,请告诉我:) .
以下代码将帮助您