PHP PDO SSL MySQL连接失败

4

我试图开发一个连接到MySQL服务器的PHP应用程序,使用SSL进行加密。我尝试使用mysql_connect连接成功,但使用PDO时却不行。当我尝试连接时,会出现以下错误:

PDO::__construct():此流不支持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 5.3.8上,当我尝试使用PDO时,mysql和SSL会失败。”,另一句则说:“在SVN中已经修复了5.3.8中的PDO和SSL问题,这是由于#ifdef中的一个拼写错误导致的。”希望它能在某种程度上有所帮助。我想你也可以将其应用于5.3.10。 - Quasdunk
我找到了那个漏洞报告,但我相信错别字是在源代码中,并且已经在后来的版本中修复,因此我认为它不适用。 - Maxxer
2个回答

2
您需要卸载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 procedural:

$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;
        }

Your certs paths must be correct. Try this in your SSL to ensure the files are there:

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

The remote host (database server) must also have SSL enabled. Run the query

SHOW VARIABLES LIKE '%ssl%';

OUTPUT:

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

If it's disabled, it will not work. Your /etc/my.cnf (or where your my.cnf is located) must contain:

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

MySQL Resource to generate keys: http://dev.mysql.com/doc/refman/5.0/en/creating-ssl-files-using-openssl.html

Lastly, the DHE cipher is not considered safe anymore. Ciphers are continually being broke, so you'll have to find out which are considered secure today.


非常感谢,可惜我没有安装来进行测试。希望对其他人有用。 - Maxxer
1
我注意到这是一个旧帖子,但它在我的所有搜索中都出现了,所以我希望其他人不要像我一样花费数小时来摆弄。 - Caleb Pitman

1

您的模块列表中不包括 openssl

您可以使用 php -m 命令检查已编译的模块。您也可以使用 php -a 命令,然后执行 var_dump(get_loaded_extensions()); 检查所有在运行时加载的模块。

为了使用 SSL 连接,您需要将其编译或作为扩展加载。

如果扩展程序存在于磁盘上(请检查您的 php 扩展目录 - 位置在 php.ini 中),那么还要检查您的 php.ini 文件中是否有以下行:extension=php_openssl.so,并确保它没有被注释掉。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接