Я успешно установил установленную 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/