我通过MySQL工作台创建了一个用户。
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 进行配置
如果我尝试在客户端机器上通过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 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_ser上"不需要"来禁用SSL,则与PDO的连接运行良好。我认为这是个错误,但也许有其他人可以帮忙?
EDIT 1:如果我使用数据库根用户,则连接正常,但我不确定是否使用了ssl,因为查询:
SHOW STATUS LIKE "%SSL%";
返回
DHE-RSA-AES256-SHA
但我认为系统是在撒谎,根本没有使用SSL安全的mysql连接。
EDIT 2:我嗅探了数据包,是的,对于root用户,连接是通过SSL保护的,但对于fba_ser,情况并非如此。
为什么我认为这个系统在撒谎?:我可以在PHP脚本中更改客户端证书的路径,甚至可以从系统中删除它们并重新启动服务器。连接仍然是SSL加密的,WTF?
我在发布Can';t使用ssl与PDO连接,但使用ssl的mysqli可以使用
我建议不要使用root用户,因为我认为你不能强制使用SSL,PDO会无声地失败,让你认为它在工作,或者如果你已经使用SSL(https),数据包可以被加密。一个简单的测试是让另一个用户,强制ssl,尝试命令行远程连接,而不是使用PDO ssl,连接将失败/被阻止,并告诉您ssl无法通过PDO工作。
无论如何,我们必须切换到MySQLI才能使DB SSL正常工作,而使用PDO根本不起作用。我仍在寻找诊断/调试的方法,并找出为什么我们不能使用PDO ssl进行连接,因为这是一个问题,一些第三方代码也随PDO一起提供,这意味着如果我们不能解决这个问题,我们就不能使用他们的代码,而且我们确实有理由使用PDO支持的多个驱动程序,所以我正在努力解决这个问题。
如果你有任何进展,请告诉我:)。
以下代码将帮助您
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' )
);