PHP PDO SSL MySQL 连接失败

标签 php mysql ssl pdo

我正在尝试开发一个使用 SSL 连接到 MySQL 服务器的 PHP 应用程序。 我尝试使用 mysql_connect 并且工作正常,但使用 PDO 却不行。当我尝试连接时出现以下错误:

PDO::__construct(): this stream does not support SSL/crypto

奇怪的是,如果我调整证书路径(指向不存在的文件),我会得到同样的错误!

我在 Debian Squeeze 上使用 php 5.3.10,安装了以下软件包:

php5-cgi 
php5-cli
php5-common
php5-fpm
php5-gd
php5-mcrypt
php5-mysql
php5-suhosin

有什么想法吗?谢谢

最佳答案

您需要删除 php-mysql 并安装 php-mysqlnd。在 Centos 上:

sudo yum remove php-mysql
sudo yum install php-mysqlnd
sudo yum reboot

Ubuntu/Debian

sudo apt-get remove php5-mysql
sudo apt-get install php5-mysqlnd
sudo reboot

mysqli程序:

$con=mysqli_init();
if (!$con)
  {
  die("mysqli_init failed");
  }

mysqli_ssl_set($con,'/ssl/client-key.pem','/ssl/client-cert.pem', '/ssl/ca.pem',NULL,NULL);

if (!mysqli_real_connect($con,'xx.xxx.xxx.xxx', 'user', 'pass' ,'dbname'))
  {
  die("Connect Error: " . mysqli_connect_error());
  }

mysqli_close($con);
?>

PDO

$ssl = array(
                PDO::MYSQL_ATTR_SSL_KEY    =>'/ssl/client-key.pem',
                PDO::MYSQL_ATTR_SSL_CERT=>'/ssl/client-cert.pem',
                PDO::MYSQL_ATTR_SSL_CA    =>'/ssl/ca.pem'
        );
        try {
                $dbl = new PDO("mysql:host=$host;dbname=$database", $user, $password, $ssl);
                $dbl->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch(PDOException $e) {
echo $e->getMessage();
die;
        }

您的证书路径必须正确。在您的 SSL 中尝试此操作以确保文件在那里:

if(file_exists('/ssl/client-key.pem') && file_exists('/ssl/client-cert.pem') && file_exists('/ssl/ca.pem')) echo 'file exists';

远程主机(数据库服务器)也必须启用 SSL。运行查询

SHOW VARIABLES LIKE '%ssl%';

输出:

+---------------+----------------------+
| Variable_name | Value                |
+---------------+----------------------+
| have_openssl  | YES                  |
| have_ssl      | YES                  |
| ssl_ca        | /ssl/ca.pem          |
| ssl_capath    |                      |
| ssl_cert      | /ssl/server-cert.pem |
| ssl_cipher    | DHE-RSA-AES256-SHA   |
| ssl_key       | /ssl/server-key.pem  |
+---------------+----------------------+

如果它被禁用,它将无法工作。您的/etc/my.cnf(或您的 my.cnf 所在的位置)必须包含:

ssl-ca=/ssl/ca.pem
ssl-cert=/ssl/server-cert.pem
ssl-key=/ssl/server-key.pem
ssl-cipher=DHE-RSA-AES256-SHA

用于生成 key 的 MySQL 资源:http://dev.mysql.com/doc/refman/5.0/en/creating-ssl-files-using-openssl.html

最后,DHE 密码不再被认为是安全的。密码不断被破解,所以你必须找出今天哪些被认为是安全的。

关于PHP PDO SSL MySQL 连接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9410108/

相关文章:

php - PHP 的 foreach 幕后发生了什么?

mysql - 读到行尾

servlets - Jetty BadMessage 嵌入式 WebSocket Servlet

ssl - IBM MobileFirst 适配器调用 ssl 错误

PhpStorm 验证自定义静态方法错误

PHP获得明年同一周的同一天

php - 在同一页显示一行的所有结果

mysql - 如何在 MySQL Workbench 的一个 Pane 中写出调试消息?

mysql - 是否可以使用mysql编辑联合表中的数据排序?

ruby-on-rails - 为 Heroku 域指定 SSL 端点