Использование amazon RDS с WordPress через SSL

Я переношу нашу базу данных WordPress на RDS, которая также используется другими службами в нашей инфраструктуре. Но я не смог найти какой-либо параметр конфигурации для wp-config.php, где я мог бы указать, что SSL будет использоваться при подключении к серверу. Также потребуется ссылка на файл центра сертификации предоставлено Amazon. Сервер приложений, на котором в данный момент работает WordPress, находится вне кластера AWS.

Ответы, которые я смог найти, были довольно старыми (здесь я использую WordPress 4.2) и не дают особых указаний.

Как настроить WordPress для использования Amazon RDS через соединение SSL (с указанием открытого ключа)?


person Jai Pandya    schedule 24.04.2015    source источник


Ответы (2)


Был такой же вопрос. К счастью, некоторые другие люди предложили здесь разумное решение: https://core.trac.wordpress.org/ticket/28625. В конце концов, вот что я сделал, чтобы заставить SSL работать:

<сильный>1. Добавьте следующее в файл wordpress wp-includes/wp-db.php. (кроме последних двух строк, которые предназначены только для ссылки на точку вставки)

//ADDED per https://core.trac.wordpress.org/ticket/28625
// call set_ssl if mysql client flag set and settings available
if ( $client_flags & MYSQL_CLIENT_SSL ) {
    $pack = array( $this->dbh );
    $call_set = false;
    foreach( array( 'MYSQL_SSL_KEY', 'MYSQL_SSL_CERT', 'MYSQL_SSL_CA',
        'MYSQL_SSL_CAPATH', 'MYSQL_SSL_CIPHER' ) as $opt_key ) {
        $pack[] = ( defined( $opt_key ) ) ? constant( $opt_key ) : null;
        $call_set |= defined( $opt_key );
    }
    /* Now if anything was packed - unpack into the function.
    * Note this doesn't check if paths exist, as per the PHP doc
    * at http://www.php.net/manual/en/mysqli.ssl-set.php: "This
    * function always returns TRUE value. If SSL setup is incorrect
    * mysqli_real_connect() will return an error ..."
    */
    if ( $call_set ) { // SSL added here!
        call_user_func_array( 'mysqli_ssl_set', $pack );
    }
}//END ADD - below is the point above which to insert this

if ( WP_DEBUG ) {
    mysqli_real_connect( $this->dbh, $host, $this->dbuser, $this->dbpassword, null, $port, $socket, $client_flags );

<сильный>2. Настройте файл wordpress wp-config.php.

Добавьте и настройте следующие строки в файле wp-config.php. Вы можете протестировать их в процессе разработки/постановки, а также в рабочей среде, если у вас несколько сред.

define('DB_HOST', 'rds-yourserver-abcdefghi9j.us-west-1.rds.amazonaws.com');
define('MYSQL_CLIENT_FLAGS', MYSQL_CLIENT_SSL);//This activates SSL mode
define('MYSQL_SSL_CA', '/file/path/to/your/aws/rds-combined-ca-bundle.pem');

Обратите внимание, что есть 5 доступных настроек MYSQL_SSL*, которые вы можете использовать в своей конфигурации для каждого кода в #1 выше. Мое подключение к RDS работает через SSL только с опцией _CA.

<сильный>3. Проверка работоспособности: ваше соединение зашифровано.

Добавьте файл быстрого теста, чтобы показать, использует ли текущее соединение Wordpress SSL или нет. Создайте пример файла, подобного этому, с именем test.php и поместите его в корень WordPress или куда-нибудь, доступный в Интернете. Не забудьте удалить этот файл после завершения тестирования.

<?php
require( dirname( __FILE__ ) . '/wp-blog-header.php' ); //EDIT THIS PATH SO IT IS CORRECT FOR YOUR test.php file relative to the wp-blog-header.php file
global $wpdb;
$row = $wpdb->get_row( "SHOW STATUS LIKE 'Ssl_cipher'" );
var_dump($row);

/*
If you are connected over SSL this should output something like:
object(stdClass)#116 (2) { ["Variable_name"]=> string(10) "Ssl_cipher" ["Value"]=> string(10) "AES256-SHA" }

If you are NOT connected over SSL this should output something like:
object(stdClass)#116 (2) { ["Variable_name"]=> string(10) "Ssl_cipher" ["Value"]=> string(10) "" }

*/
?>

<сильный>4. Разверните и протестируйте соединение

Разверните ваши изменения и файл test.php в вашей установке WordPress и перезапустите веб-сервер по мере необходимости. Я использую apache, поэтому я запускаю

sudo apachectl restart
person randalv    schedule 01.05.2015
comment
Это отлично работало в Microsoft Azure, подключаясь к Amazon RDS в качестве альтернативы ClearDB. - person uniquelau; 09.03.2016
comment
Является ли константа MYSQL_CLIENT_SSL или MYSQLI_CLIENT_SSL? Я думаю, что MYSQLI_CLIENT_SSL работает для меня. - person xpander001; 16.11.2017
comment
@ xpander001 2,5 года назад, когда я писал, в имени переменной не было I, но я видел другие онлайн-ссылки, в которых упоминается I, так что, вероятно, это более новая версия. - person randalv; 17.11.2017

Для тех, кто использует Redhat 7 + Apache 2.4 + PHP 7. Я столкнулся с той же проблемой, поэтому добавил две строки ниже в wp-config.php, как указано выше.

определить('MYSQL_CLIENT_FLAGS', MYSQLI_CLIENT_SSL | MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT ); // вам нужно это для PHP 7 define('MYSQL_SSL_CA', '/var/www/BaltimoreCyberTrustRoot.crt.pem');

Однако так и не смог подключиться к БД...

Так позвонил одному парню, и он попросил меня отключить Selinux, выполнив следующую команду:

setsebool -P httpd_can_network_connect_db 1

Я сказал, чувак, я уже отключил SELinux, зачем мне снова запускать это? Он кричал мне: Я НЕ ЗНАЮ, ПРОСТО БЕГИ!

так что я сделал и перезапустил httpd, и он работал без изменения wp-db.php ... не спрашивайте меня, почему, поскольку я совершенно не понимаю логику, стоящую за этим.

person star    schedule 31.07.2018