Uso de Amazon RDS con WordPress sobre SSL

4 minutos de lectura

avatar de usuario
jai pandya

Estoy migrando nuestra base de datos de WordPress a RDS, que también está siendo utilizada por otros servicios en nuestra infraestructura. Pero no pude encontrar ninguna opción de configuración para wp-config.php donde podría especificar que SSL se usará mientras se conecta al servidor. Esto también necesitaría una referencia a la archivo de autoridad certificadora proporcionado por Amazon. El servidor de aplicaciones en el que se ejecuta WordPress actualmente está fuera del clúster de AWS.

Las respuestas que pude encontrar eran bastante antiguas (estoy usando WordPress 4.2 aquí) y no brindan mucha orientación.

¿Cómo puedo configurar WordPress para usar Amazon RDS a través de una conexión SSL (especificando la clave pública)?

Tenía la misma pregunta. Afortunadamente, algunas otras personas habían propuesto una solución razonable aquí: https://core.trac.wordpress.org/ticket/28625. De principio a fin, esto es lo que hice para que SSL funcionara:

1. Agregue lo siguiente al archivo wordpress wp-includes/wp-db.php. (excepto las últimas 2 líneas que son solo para referencia de punto de inserción)

//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. Personaliza tu archivo wordpress wp-config.php.

Agregue y personalice las siguientes líneas en su archivo wp-config.php. Puede probarlos desde el desarrollo o la puesta en escena, así como desde la producción si tiene varios entornos.

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');

Tenga en cuenta que hay 5 configuraciones MYSQL_SSL* disponibles que podría usar en su configuración, según el código en el n.° 1 anterior. Mi conexión RDS funciona a través de SSL con solo la opción _CA.

3. Prueba de cordura de que tu conexión está encriptada.

Agregue un archivo de prueba rápida para mostrar si la conexión actual de WordPress usa SSL o no. Cree un archivo de muestra como este llamado test.php, y colóquelo en su raíz de wordpress o en algún lugar accesible desde la web. No olvide eliminar este archivo cuando termine la prueba.

<?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. Implemente y pruebe su conexión

Implemente su archivo changes & test.php en su instalación de wordpress y reinicie su servidor web según sea necesario. Estoy usando apache, así que corro

sudo apachectl restart

  • Esto funcionó perfectamente en Microsoft Azure, conectándose a Amazon RDS como alternativa a ClearDB.

    – Uniquelau

    9 de marzo de 2016 a las 11:36

  • ¿La constante es MYSQL_CLIENT_SSL o MYSQLI_CLIENT_SSL? Creo que MYSQLI_CLIENT_SSL está funcionando para mí.

    – andersuamar

    16 de noviembre de 2017 a las 17:11

  • @ xpander001 Hace 2,5 años, cuando publiqué, no había una I en el nombre de la variable, pero he visto otras referencias en línea que mencionan la I, por lo que es probable que sea una versión más nueva.

    – randalv

    17 de noviembre de 2017 a las 3:50

avatar de usuario
estrella

Para cualquiera que esté usando Redhat 7 + Apache 2.4 + PHP 7. Estaba enfrentando el mismo problema, así que agregué dos líneas debajo de wp-config.php como se mencionó anteriormente.

define(‘MYSQL_CLIENT_FLAGS’, MYSQLI_CLIENT_SSL | MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT ); // necesita esto para PHP 7 define(‘MYSQL_SSL_CA’, ‘/var/www/BaltimoreCyberTrustRoot.crt.pem’);

Sin embargo, todavía no podía conectarse a la base de datos…

Entonces llamó a un tipo y me pidió que deshabilitara Selinux ejecutando el siguiente comando:

setsebool -P httpd_can_network_connect_db 1

Dije, amigo, ya deshabilité SELinux, ¿por qué necesito ejecutar esto nuevamente? Me gritó: ¡NO LO SÉ, SOLO HAZLO!

así que lo hice y reinicié el httpd, y funcionó sin cambiar wp-db.php… no me preguntes por qué, ya que tampoco tengo ni idea de la lógica detrás de esto.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad