Подключения PHP к MySQL SSL

Я успешно установил установленную SSL установку MySQL на один сервер в одной сети и могу подключиться к ней с помощью 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(); ?> 

Здесь 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 null, если вы не хотите использовать клиентский сертификат, который действительно должен отличаться от вашего сертификата сервера. (Я не помню, работает ли это.)
  • возможно, проще всего опустить 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 ).

Возможно, ваша версия 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"; 

Распечатать?

Вы должны быть осторожны, если используете 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/