Я пытаюсь развернуть веб-приложение на провайдере общего хостинга (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
.