«Отказано в доступе» при попытке подключиться к экземпляру Amazon-RDS с использованием SSL с общего хостинга (но работает при локальном тестировании) - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь развернуть веб-приложение на провайдере общего хостинга (Strato), но у меня возникают проблемы с установлением SSL-соединения с используемым экземпляром Amazon-RDS.При локальном тестировании веб-приложения (с использованием XAMPP) оно работает нормально, но на общедоступном хостинге я получаю сообщение об ошибке HTTP-500 через 2 минуты.

Мое веб-приложение использует платформу Code Igniter (ноЯ думаю, что это не то, что вызывает проблему).Пользователь базы данных был создан с использованием атрибута REQUIRE SSL, чтобы обеспечить использование SSL.Значение «host» пользователя для% «разрешено» для удаленных подключений.

Сначала я проверил журналы ошибок apache.Они говорили

"19.09.2019 10:13:23 my-url.de [client XXXX:XXXX:XXXX::] End of script output before headers: index.php"

каждый раз, когда я пытался зайти на сайт.Затем я попытался протестировать минимальный пример, даже не используя Code Igniter (код ниже).

$servername = "XXXXXXXXXX.XXXXXXXXXXX.eu-central-1.rds.amazonaws.com";
$username = "username";
$password = "password";
$dbname = "db_name";

$con = mysqli_init();
if (!$con){
    die("mysqli_init failed");
}

$ca_filename = realpath('./../cert/rds-combined-ca-bundle.pem');
echo 'Does the ca file exist? '. (file_exists($ca_filename) ? 'true' : 'false').'<br>';

$con->options(MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, FALSE);
mysqli_ssl_set(
    $con,
    NULL,
    NULL,
    realpath('./../cert/rds-combined-ca-bundle.pem'),
    NULL,
    NULL); 

if (!mysqli_real_connect($con,$servername, $username, $password, $dbname, 3306))
{
    die("Connect Error: " . mysqli_connect_error());
}

echo "Connected to database.<br>";

$res = $con->query("SHOW STATUS LIKE 'Ssl_cipher'");
$row = $res->fetch_assoc();
if(empty($row['Value'])) {
    echo 'No SSL';
} else {
    echo $row['Value'].'<br>';
}

mysqli_close($con);

Я ожидал некоторый вывод, например

Does the ca file exist? true
Connected to database.
DHE-RSA-AES256-SHA

При локальном тестировании (с использованием XAMPP)Я получил следующий вывод:

Does the ca file exist? true
Connected to database.
DHE-RSA-AES128-SHA

(это странно, потому что он говорит «Нет SSL», даже если пользователь требует SSL - но соединение установлено) РЕДАКТИРОВАТЬ: Это выглядит такон работает правильно.

Затем я тестировал его на виртуальном хостинге и получил в качестве вывода:

Does the ca file exist? true
Warning: mysqli_real_connect(): (28000/1045): Access denied for user 'username'@'XXX.XXX.XXX.XXX' (using password: YES) in /shared/hosting/path/htdocs/public/dbtest.php on line 25 Connect Error: Access denied for user 'username'@'XXX.XXX.XXX.XXX' (using password: YES)

UPDATE 1

ByСравнивая phpinfo() моего локального сервера с одним из общего хостинга, я обнаружил, что мой локальный сервер использует «mysqlnd» (MySQL Native Driver), в то время как сервер общего хостинга использует «mysql».Информация в «mysqlnd» гласит: «Основной SSL: поддерживается», хотя в phpinfo() общего хостера абсолютно нет информации о SSL, связанной с SQL.Разве невозможно установить SSL-соединение без mysqlnd?

ОБНОВЛЕНИЕ 2

Я сделал еще один запуск, используя PDO вместо mysqli.Та же проблема: работает локально, но не на виртуальном хостинге.На этот раз я получил сообщение об ошибке Fatal error: Uncaught Error: Undefined class constant 'MYSQL_ATTR_SSL_VERIFY_SERVER_CERT'.Я прочитал здесь , что если это произойдет, это означает, что мне нужно обновить версию PHP (что странно, потому что хост-сервер работает под управлением PHP 7.2.22).Даже после изменения версии PHP на 7.3.9 (более новой, чем та, которую я использую локально), ошибка все равно возникает.Если я удаляю строку PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => FALSE из новой версии скрипта, я снова получаю ошибку Access denied.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Благодаря @Adiii и @benra я нашел причину проблемы: начиная с PHP 5.3.0 он обычно использует MySQL Native Driver , но используемый мной общий хостер (Strato) имеет PHP 7установка, которая все еще использует устаревший драйвер MySQL.Поэтому MYSQLI_OPT_SSL_VERIFY_SERVER_CERT (для mysqli) и MYSQL_ATTR_SSL_VERIFY_SERVER_CERT (для pdo) недоступны, что вызывает проблему при использовании CA-файлов облачных провайдеров, таких как Amazon RDS или Google Cloud.Мое решение для этого будет использовать собственный V-сервер.

0 голосов
/ 19 сентября 2019

Это очень похоже на проблему группы безопасности.При локальном тестировании вы, вероятно, входите в RDS с вашим частным IP-адресом через определенный порт (если SSL 443).

Возможно, у вас не настроена группа безопасности, что входящий трафик разрешен с другогопубличные IP-адреса.Я бы дважды проверил все правила группы безопасности.Если это разрешает ваши локальные соединения и то, что вы разрешаете, если это другой IP.

...