我正在尝试开发一个使用SSL连接到MySQL服务器的PHP应用程序。 我尝试使用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
有什么想法吗?感谢
答案 0 :(得分:1)
您的模块列表不包括openssl
您可以使用php -m
检查已编译的模块。您可以通过运行php -a
然后执行var_dump(get_loaded_extensions());
为了使用SSL连接,您需要将其编译或作为扩展加载。
如果磁盘上存在扩展名(请查看您的php扩展程序目录 - php.ini
中的位置),请检查php.ini
行extension=php_openssl.so
并确保其未被注释掉。
答案 1 :(得分:1)
你需要删除php-mysql并安装php-mysqlnd。在Centos:
sudo apt-get remove php5-mysql
sudo apt-get install php5-mysqlnd
sudo reboot
的Ubuntu / Debian的
$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);
?>
mysqli程序:
$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;
}
PDO
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%';
远程主机(数据库服务器)还必须启用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 |
+---------------+----------------------+
输出:
ssl-ca=/ssl/ca.pem
ssl-cert=/ssl/server-cert.pem
ssl-key=/ssl/server-key.pem
ssl-cipher=DHE-RSA-AES256-SHA
如果它被禁用,它将无效。您的/etc/my.cnf(或my.cnf所在的位置)必须包含:
pdfimages
用于生成密钥的MySQL资源:http://dev.mysql.com/doc/refman/5.0/en/creating-ssl-files-using-openssl.html
最后,DHE密码不再被认为是安全的。密码不断被破坏,所以你必须找出今天被认为安全的密码。