Мне нужно подключиться к MySQL 8 из старого приложения PHP 5.3.3. У меня нет разрешения на обновление версии PHP.
Требуется, чтобы соединение было через SSL, но не с использованием аутентификации SSL. Сервер MySQL настроен на использование шифра для подключения, но не требует от клиента предоставления каких-либо сертификатов SSL-аутентификации вообще.
Я использовал консольные команды, чтобы убедиться, что SSL-соединение работает от моего компьютера к серверу:
mysql -u username -p -h domain.com --ssl-mode=REQUIRED
mysql> \s
SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256
mysql> SHOW STATUS LIKE 'Ssl_cipher';
+---------------+---------------------------+
| Variable_name | Value |
+---------------+---------------------------+
| Ssl_cipher | DHE-RSA-AES128-GCM-SHA256 |
+---------------+---------------------------+
1 row in set (0.05 sec)
Итак, текущее соединение зашифровано с использованием сертификата сервера и принимает его без уведомления, без какой-либо проверки CA.
Затем я попытался воспроизвести это в PHP, используя mysqli:
$mysqli = mysqli_init();
// I've no idea how to tell PHP to ignore all certificates but still use SSL as provided by the server;
// even passing random crap to ssl_set() doesn't change anything at all - not even failed connection
$mysqli->ssl_set(null, null, null, null, null);
$mysqli->real_connect($mysqliDomain, "username", "pass", "db", "3306", null, MYSQLI_CLIENT_SSL);
// Not sure about MYSQLI_CLIENT_SSL - PHP doc says it shouldn't be used from application side; but it doesn't work anyway, no matter if I use it or not.
// In addtion, disabling server cert verification MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT
// is not supported in PHP 5.3.3
$res = $mysqli->query("SHOW STATUS LIKE 'Ssl_cipher';");
while ( $row = $res->fetch_array() ) {
print_r($row);
}
Независимо от того, что я пытаюсь, результатом является пустое значение шифра, что означает, что соединение не зашифровано:
Array ( [0] => Ssl_cipher [Variable_name] => Ssl_cipher [1] => [Value] => )
Как это решить?