我通过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服务器(5.5.34-0ubuntu0.13.04.1)配置为使用SSL,生成所需的证书和密钥,并通过/etc/mysql/my.cnf配置它们。 p>
如果我尝试在客户端计算机上通过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 |
| ... | ... |
+--------------------------------+------------------------+
但如果我使用PHP(PHP / 5.4.9-4ubuntu2.3)与PDO连接到数据库,则连接无法正常工作。我试过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
如果我通过fba_user上的“不需要”禁用SSL ,与PDO的连接就可以正常工作。我认为这是一个错误,但也许其他人可以帮忙吗?
编辑1 :如果我使用数据库root用户,连接正常,但我不确定是否使用了ssl,因为查询:
SHOW STATUS LIKE "%SSL%";
确实返回
DHE-RSA-AES256-SHA
但我认为系统正在撒谎,并且根本没有使用SSL安全的mysql连接。
编辑2 :我嗅探了数据包,是的,对于root用户,连接是通过SSL保护的,但是对于fba_user,情况并非如此。
为什么我认为系统在说谎?:我可以在PHP脚本中更改客户端证书的路径,我甚至可以从系统中删除它们并重新启动服务器。连接仍然是SSL加密的,WTF?
答案 0 :(得分: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支持的多个驱动程序,所以我试图解决这个问题。
如果你取得了任何进展,请告诉我:)。
答案 1 :(得分: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' )
);