Соединения PHP с MySQL SSL - PullRequest
       10

Соединения PHP с MySQL SSL

3 голосов
/ 07 сентября 2010

Я успешно настроил установку MySQL с включенным SSL на одном сервере в одной сети и могу подключиться к нему с помощью SSL с клиентом mysql командной строки Linux на другом сервере в другой сети, однако каждый раз, когда я пытаюсь подключиться ( используя PHP 5.3.3) я продолжаю получать:

Предупреждение: mysqli_real_connect (): (HY000 / 2026): ошибка соединения SSL в /var/www/html/test.php в строке 18

Мой PHP выглядит следующим образом: я сделал что-то не так? Сертификаты 777 (только во время тестирования), и тот же код работает для незашифрованного соединения другого пользователя (с закомментированной настройкой SSL, т.е. mysqli может определенно подключаться в общем случае к БД)

<?php

error_reporting(E_ALL);
ini_set("display_errors", "1");

$obj = mysqli_init();

mysqli_options($obj, MYSQLI_OPT_CONNECT_TIMEOUT, 5);

mysqli_ssl_set( $obj,
                '/mysql-ssl-certs/server-key.pem',
                '/mysql-ssl-certs/server-cert.pem',
                '/mysql-ssl-certs/ca-cert.pem',
                NULL,
                NULL);


$link = mysqli_real_connect($obj, 'localhost', 'ssluser', 'some_password', 'test');

if (!$link)
{
    die('<br /><br />Connect Error (' . mysqli_connect_errno() . ') '.mysqli_connect_error());
}

echo 'Success... ' . mysqli_get_host_info($obj) . "\n";

$obj->close();

?>

Ответы [ 3 ]

7 голосов
/ 07 сентября 2010

Здесь PHP (и mysqli_real_connect) - это клиент, а не сервер.Вы настраиваете его с mysqli_ssl_set для аутентификации по сертификату клиента (и с использованием ключа и сертификата сервера).

Я не уверен, как вы настроили свой сервер MySQL, но должно быть что-то вродеэто в разделе сервера (MySQL) конфигурации:

ssl-key=/mysql-ssl-certs/server-key.pem
ssl-cert=/mysql-ssl-certs/server-cert.pem
ssl-ca=/mysql-ssl-certs/ca-cert.pem

Они так или иначе не принадлежат стороне клиента (только сертификат CA делает, но определенно не закрытый ключ сервера).

Как только вы это сделаете, вы можете попытаться проверить, правильно ли настроен сервер, используя клиент командной строки:

mysql --ssl-verify-server-cert --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...

или, возможно, вот так (хотя убедитесь, что сертификат сервера действительно должен быть включен для SSL/ TLS, чтобы быть полезным)

mysql --ssl-ca=/mysql-ssl-certs/ca-cert.pem --ssl -h hostname ...

Это должно работать по крайней мере в командной строке.

Затем из PHP вы получите две опции:

  • используйте mysqli_ssl_set, как вы сделали, но оставьте $key и $cert пустыми, если только вы не хотите использовать сертификат клиента, который действительно должен отличаться от сертификата вашего сервера.(Я не могу вспомнить, работает ли это.)
  • возможно, проще, пропустите mysqli_ssl_set в целом и настройте это в вашем глобальном файле конфигурации клиента MySQL (где PHP должен иметь возможность подобрать его, возможно,/etc/mysql/my.cnf, но это может варьироваться в зависимости от вашего дистрибутива):

    [client]
    ssl-ca=/mysql-ssl-certs/ca-cert.pem
    

(Это похоже на конфигурацию сервера, но на стороне клиента / в разделе клиента.)

Для части авторизации (GRANT):

  • REQUIRE SSL требуется только использование SSL / TLS
  • REQUIRE ISSUER, REQUIRE SUBJECT иREQUIRE X509 требует, чтобы клиент предоставил сертификат клиента для сравнения с необходимыми значениями (это тот случай, когда вам нужно будет использовать ssl-key и ssl-cert на стороне клиента (config или в mysqli_ssl_set).
0 голосов
/ 14 апреля 2015

Будьте осторожны, если вы используете MySQL до 5.7.3 и стандартную библиотеку PHP:

До MySQL 5.7.3 --ssl разрешает, но не требует от клиента подключиться к серверу с помощью SSL. Поэтому этот вариант не само по себе достаточно, чтобы использовать соединение SSL. За Например, если вы укажете эту опцию для клиентской программы, но сервер не был настроен для разрешения соединений SSL, используется незашифрованное соединение.

http://dev.mysql.com/doc/refman/5.7/en/ssl-options.html#option_general_ssl

В случае PHP, MySQL будет молча терпеть неудачу, если сервер не поддерживает SSL

https://www.idontplaydarts.com/2015/03/mysql-with-ssl-does-not-protect-against-active-mitm/

0 голосов
/ 07 сентября 2010

Возможно ваша версия php использует mysqlnd в качестве драйвера транспорта, который не поддерживает ssl (пока?).
Что печатает

<?php
error_reporting(E_ALL);
ini_set("display_errors", "1");
echo 'version: ', phpversion(), "\n";
echo function_exists('mysqli_fetch_all') ? 'mysqlnd' : '--', "\n";

?

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