Сбой соединения PDO с базой данных при проверке сертификата - PullRequest
0 голосов
/ 03 мая 2019

Я использую базу данных mysql на Ubuntu 18.04 LTS. Все работает правильно, кроме случаев, когда я пытаюсь реализовать SSL, следуя этим инструкциям: https://www.digitalocean.com/community/tutorials/how-to-configure-ssl-tls-for-mysql-on-ubuntu-16-04 https://www.acunetix.com/blog/articles/securing-mysql-server-ubuntu-16-04-lts-configuring-mysql-securely-part-3/

соединение не установлено. Я пытался реализовать его, используя как PDO, так и обычное MYSQLI-соединение, но при проверке сертификата он не работает.

Я использую PHP 7.1.8 с транспортером mysqlnd.

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>SSL Connection test</title>
  </head>
  <body>
    <?php
    phpinfo();
    $servername = "****";
    $username = "****";
    $password = "****";
    $dbname = "****";

    $options = array(
      PDO::MYSQL_ATTR_SSL_KEY => 'client-key.pem',
      PDO::MYSQL_ATTR_SSL_CERT => 'client-cert.pem',
        PDO::MYSQL_ATTR_SSL_CA => 'ca.pem',
        PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
    );

    try {
        $conn = new PDO("mysql:host=$servername;port=3306;dbname=$dbname;", $username, $password, $options);
        // set the PDO error mode to exception
        $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        echo "Connected successfully";
            var_dump($conn->query("SHOW STATUS LIKE 'Ssl_cipher';")->fetchAll());
    }
    catch(PDOException $e)
        {
        echo "Connection failed: " . $e->getMessage();
    }

    ?>
  </body>
</html>

Это код, который я сейчас использую для проверки работоспособности. Всякий раз, когда я делаю PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT false, соединение успешно. Если PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT истинно, соединение не устанавливается.

Сообщения об ошибках при сбое:

Ошибка подключения: SQLSTATE [HY000] [2002]

Сообщение о подключении:

Подключено успешноarray (1) {[0] => array (4) {["Variable_name"] => string (10) "Ssl_cipher" [0] => string (10) "Ssl_cipher" ["Value"] => строка (18) "DHE-RSA-AES256-SHA" [1] => строка (18) "DHE-RSA-AES256-SHA"}}

Сертификаты были проверены с помощью следующего кода:

openssl verify -CAfile ca.pem server-cert.pem client-cert.pem

Возвращает OK для обоих файлов.

Последние пару часов я пытался это исправить, но, похоже, не могу решить проблему.

Пожалуйста, помогите мне решить эту проблему.

Редактировать: Все файлы (client-key.pem, client-cert.pem, ca.pem) были протестированы с is_readable и доступны для чтения.

1 Ответ

1 голос
/ 03 мая 2019

Как вы, возможно, знаете, в вашей конфигурации Windows Server IIS PHP вам необходимо установить директиву openssl.cafile, указав путь к файлу центра сертификации (CA). Это не обязательно в Linux, где используется системное значение по умолчанию. MYSQL_ATTR_SSL_CA нуждается в этом пути в Windows и может быть опущен в Linux.

Чтобы добавить эту логику в сценарий тестирования PDO, добавьте дополнительную переменную с информацией о вашей ОС и измените строку MYSQL_ATTR_SSL_CA:

$OS = ( strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN' );
PDO::MYSQL_ATTR_SSL_CA => $OS ? 'c:/path/to/cacert.pem' : '',

Ваш массив $ options становится:

$OS = ( strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN' );

$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
    PDO::MYSQL_ATTR_SSL_CA => $OS ? 'c:/path/to/cacert.pem' : '',
    PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
);

f $OS === true (e.g $OS === 'WIN') используйте c:/path/to/cacert.pem в качестве пути к файлу PDO :: MYSQL_ATTR_SSL_CA, иначе мы находимся в Linux и пропускаем путь. Таким образом, вы уверены, что можете использовать этот кросс-платформенный код PHP как на Windows Server, так и на Linux!

Безопасное соединение MySQL с WordPress

В WordPress вы можете использовать плагин Secure DB Connection для установки и настройки SSL-соединения с вашей базой данных MySQL. Не забудьте установить REQUIRE SSL в привилегиях вашей базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...