PHP PDO SSL MySQL соединение не удается - PullRequest
4 голосов
/ 23 февраля 2012

Я пытаюсь разработать приложение PHP, которое подключается к серверу MySQL с использованием SSL. Я пытался использовать mysql_connect и работает нормально, но с PDO это не так. Когда я пытаюсь подключиться, я получаю следующую ошибку:

PDO :: __ construct (): этот поток не поддерживает SSL / crypto

Что выглядит странным, так это то, что если я подправлю пути к сертификатам (чтобы указать на несуществующие файлы), я получу ту же ошибку!

Я использую php 5.3.10 в Debian Squeeze, установлены следующие пакеты:

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

Есть идеи? спасибо

Ответы [ 2 ]

1 голос
/ 12 июня 2015

Вам нужно удалить 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

Ресурс MySQL для генерации ключей: http://dev.mysql.com/doc/refman/5.0/en/creating-ssl-files-using-openssl.html

Наконец, шифр DHEбольше не считается безопасным.Шифры постоянно взламываются, поэтому вам придется выяснить, какие из них сегодня считаются безопасными.

1 голос
/ 24 февраля 2012

Ваш список модулей не включает openssl

Вы можете проверить скомпилированные модули с php -m. И вы можете проверить все модули, загруженные во время выполнения, запустив php -a и выполнив var_dump(get_loaded_extensions());

Вам понадобится, чтобы это было либо скомпилировано, либо загружено как расширение для использования SSL-соединения.

Если расширение существует на диске (проверьте каталог расширений php - расположение в php.ini), то также проверьте php.ini на наличие строки extension=php_openssl.so и убедитесь, что оно не закомментировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...