Я пытаюсь настроить https://hub.docker.com/_/wordpress -> клиент mysql wordpress:php8.3-apache для использования шифрования соединения с сервером MySQL.
Я определил параметры MYSQL в wp-config.php.
define("MYSQL_CLIENT_FLAGS", MYSQLI_CLIENT_SSL | MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT);
define("DB_SSL", true);
define("MYSQL_SSL_KEY", "/usr/src/wordpress/sql/client-key.pem");
define("MYSQL_SSL_CERT", "/usr/src/wordpress/sql/client-cert.pem");
define("MYSQL_SSL_CA", "/usr/src/wordpress/sql/server-ca.pem");
Очевидно, я также скопировал эти файлы (*.pem) в указанный каталог /usr/src/wordpress/sql/
Проблема в том, что я получаю ошибку «Доступ запрещен». Я считаю, что сертификаты не используются.
PHP Warning: mysqli_real_connect(): (HY000/1045): Access denied for user 'root'@'x.190' (using password: YES) in /usr/src/wordpress/wp-includes/class-wpdb.php on line 1987
Почему это происходит? Как я могу проверить, использует ли он предоставленные сертификаты, и если нет, то почему бы и нет?
версия mysql не имеет к этому никакого отношения. Это просто куча мусора под названием PHP и WordPress. MySQL — это управляемый сервер в Google Cloud, на котором я создал сертификаты. Wordpress просто не может обрабатывать сертификаты для MySQL «из коробки». Есть проблемы более 10 лет как с самим WordPress, так и с PHP.
связано с билетом wp 28625?
Да, открылся 10 лет назад...
Поскольку вы нашли ответ, хотите ли вы закрыть вопрос, ответить самостоятельно или проголосовать за него и принять существующий ответ?






Это выглядит как типичный драгоценный камень экосистемы PHP. В документации по опциям mysqli есть комментарий 17-летней давности, в котором говорится:
Although it is not explained on the manual,
MYSQLI_OPT_SSL_VERIFY_SERVER_CERT is an option only valid for mysqlnd
and will raise an error if used with mysqli.
Это дало мне подсказку, и после нескольких тестов я обнаружил, что WordPress по какой-то причине не использует mysqlnd. mysqlnd не установлен. Установка кажется невыполнимой задачей, поэтому я отказался от этого. По сути, все константы сертификата были определены напрасно (т. е. бесполезно), и WordPress не поддерживает зашифрованные соединения MySQL (по крайней мере, не через конфигурацию).
Похоже, что метод использования сертификатов для MySQL заключается в редактировании /usr/src/wordpress/wp-includes/class-wpdb.php и использовании mysqli_ssl_set:
mysqli_ssl_set($this->dbh, MYSQL_SSL_KEY, MYSQL_SSL_CERT, MYSQL_SSL_CA,NULL,NULL); сразу после mysqli_init()
Вы можете использовать эту строку во время процесса сборки:
sed -i -e 's/mysqli_init();/mysqli_init();\nmysqli_ssl_set($this->dbh, MYSQL_SSL_KEY, MYSQL_SSL_CERT, MYSQL_SSL_CA,NULL,NULL);/g' /usr/src/wordpress/wp-includes/class-wpdb.php
Также есть примечание , в котором говорится Be warned, MySQL prior to versions 5.7.3 do not require the server to use SSL [1]. In the case of PHP the client won't throw an error if the connection is downgraded to plain-text [2], поэтому относитесь к этому шифрованию/безопасности с недоверием.
Если у вас есть возможность, избегайте PHP как чумы. Вся экосистема, включая собственную документацию PHP, представляет собой большую кучу мусора.
Как создается пользователь в MySQL? Какая версия MySQL? Содержит ли сервер MySQL ключ/сертификат CA? Почему вы используете пользователя root для WordPress?