No se puede conectar con PDO usando ssl pero mysqli con ssl funciona

Configuramos mysql con SSL creando los certificados, actualizando my.cnf, creando usuarios con los privilegios correctos y requiriendo ssl, reiniciando el servicio y verificando que funciona del lado del servidor y del lado del cliente (a través de la línea de comando mysql) al conectarse de forma remota. También he verificado que PDO funciona correctamente con la misma configuración pero deshabilitando el “require ssl” en la cuenta de usuario en mysql porque simplemente falla silenciosamente y usa una conexión que no es SSL.

Sin embargo, cuando se utiliza la aplicación PHP para conectarse, no funciona usando PDO forzando ssl, pero funciona usando mysqli con force ssl. Pensé que usaban los mismos drivers y que ambos deberían funcionar bien. El mensaje de error que recibo es ‘Falló la conexión a la base de datos [SQLSTATE [28000] [1045] Acceso denegado para el usuario’, pero el usuario existe y esta conexión funciona con mysqli (force ssl) y la conexión funciona solo si PDO ‘ requiere ssl ‘del usuario en mysql.

php 5.5.9 CentOS versión 6.5 (Final) pdo_mysql 5.5.31

Avíseme si puedo proporcionar información adicional. A continuación hay ejemplos de conexión,

//mysqli $conn=mysqli_init(); mysqli_ssl_set($conn, $clientkey, $clientcert, $sharedca, NULL, NULL); if (!mysqli_real_connect($conn, $host, $user, $pass, $db)) { die("Failed connecting to ssl mysql via mysqli"); } $res = mysqli_query($conn, "SHOW STATUS like 'Ssl_cipher'"); print_r(mysqli_fetch_row($res)); mysqli_close($conn); //pdo $options = array_merge($options, array( PDO::MYSQL_ATTR_SSL_KEY => $sslkey, PDO::MYSQL_ATTR_SSL_CERT => $sslcert, PDO::MYSQL_ATTR_SSL_CA => $sslca, )); try { $pdo = new PDO("mysql:dbname={$db};host={$host}", $user, $pass, $options); } catch( PDOException $e ) { die("Failed connecting"); } 

¿Hay algo que deba saber sobre cómo conectarme correctamente usando SSL con PDO? ¿O estoy obligado a cambiar a mysqli porque el soporte de PDO para SSL puede ser problemático?

Gracias.

El siguiente código resolverá su problema,
nuevo PDO (‘mysql: host =’. HOST. ‘; dbname =’. DBNAME. ‘; charset = utf8’, USUARIO, CONTRASEÑA, matriz (PDO :: MYSQL_ATTR_SSL_KEY => ‘/ mysqlsslcertificate1 / client-key.pem’, PDO :: MYSQL_ATTR_SSL_CERT => ‘/ mysqlsslcertificate1 / client-cert.pem’, PDO :: MYSQL_ATTR_SSL_CA => ‘/ mysqlsslcertificate1 / ca-cert.pem’));

El problema real es la validación CN del servidor certificado (desajuste) pero el error informado es PDOException: SQLSTATE[HY000] [2002]

Hay numerosos errores en PHP registrados para ese problema como: 71845 71003 y Github PR

La solución es este atributo no documentado disponible después de PHP 5.6.22 (no estoy seguro), 7.0.18 (verificado) y 7.1.15 (no estoy seguro)

PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT

valores posibles: verdadero, falso valor predeterminado: verdadero

para que tu código se vea como

 $pdo = new PDO('mysql:host=XXXXXX;dbname=XXXXXX', 'XXXXXX', 'XXXXXX', array( PDO::MYSQL_ATTR_SSL_KEY =>'/path/to/client-key.pem', PDO::MYSQL_ATTR_SSL_CERT =>'/path/to/client-cert.pem', PDO::MYSQL_ATTR_SSL_CA =>'/path/to/server-ca.pem', PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false ) 

);