2012-03-16 27 views
12

Estoy intentando conectar con el servidor remoto MySQL con SSL de PHP utilizando mysql_connect:Conectar al servidor remoto MySQL con SSL de PHP

$link = mysql_connect(
    "ip", 
    "user", 
    "pass", 
    true, 
    MYSQL_CLIENT_SSL 
) 

Y conseguir peor error jamás:

SSL connection error 

I 'he añadido siguientes parametros en my.cnf:

[client] 
ssl-ca  =/etc/mysql/ssl/ca-cert.pm 
ssl-cert =/etc/mysql/ssl/client-cert.pem 
ssl-key  =/etc/mysql/ssl/client-key.pem 

Así que se puede conectar a MySQL remota con éxito desde el terminal simplemente usando

#mysql -h ip -u user -p 

Así que la conexión al servidor de mysql funciona y, por lo que yo sé, el problema está en la cooperación de php/mysql. Probablemente me faltan algunos params.

Lamentablemente no puedo usar mysqli lib porque tengo demasiados adaptadores de trabajo para pdo_mysql.

Mi versión de PHP es 5.3.6-13ubuntu3.6 versión de MySQL es 5.1.61

También he añadido

mssql.secure_connection = On 

a mi php.ini

ayuda será ¡apreciado!

+2

si está utilizando MySQL, ¿no debería estar configurando 'mysql.secure_connection = On'? –

+0

@SorinButurugeanu no hay una opción llamada 'mysql.secure_connection' en php.ini !! – Songo

Respuesta

30

"Desafortunadamente no puedo usar mysqli lib porque tengo demasiados adaptadores de trabajo para pdo_mysql."

Está utilizando la antigua extensión de MySQL ("mysql_connect"), que ya no se encuentra en desarrollo (maintenance only). Dado que está utilizando PHP 5, es posible que desee utilizar MySQLi, la extensión de MySQL mejorada Extension.Entre otras cosas, tiene una interfaz orientada a objetos, soporte para declaraciones preparadas/múltiples y capacidades mejoradas de depuración. Puede leer más sobre la conversión a MySQLi here; más sobre la clase mysqli en sí misma here.

Aquí hay un código de ejemplo que puede ayudar a empezar:

<?php 
ini_set ('error_reporting', E_ALL); 
ini_set ('display_errors', '1'); 
error_reporting (E_ALL|E_STRICT); 

$db = mysqli_init(); 
mysqli_options ($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, true); 

$db->ssl_set('/etc/mysql/ssl/client-key.pem', '/etc/mysql/ssl/client-cert.pem', '/etc/mysql/ssl/ca-cert.pem', NULL, NULL); 
$link = mysqli_real_connect ($db, 'ip', 'user', 'pass', 'db', 3306, NULL, MYSQLI_CLIENT_SSL); 
if (!$link) 
{ 
    die ('Connect error (' . mysqli_connect_errno() . '): ' . mysqli_connect_error() . "\n"); 
} else { 
    $res = $db->query('SHOW TABLES;'); 
    print_r ($res); 
    $db->close(); 
} 
?> 

Si PDO_MYSQL es realmente lo que quieres, entonces usted necesita para hacer algo como esto:

<?php 
$pdo = new PDO('mysql:host=ip;dbname=db', 'user', 'pass', array(
    PDO::MYSQL_ATTR_SSL_KEY =>'/etc/mysql/ssl/client-key.pem', 
    PDO::MYSQL_ATTR_SSL_CERT=>'/etc/mysql/ssl/client-cert.pem', 
    PDO::MYSQL_ATTR_SSL_CA =>'/etc/mysql/ssl/ca-cert.pem' 
    ) 
); 
$statement = $pdo->query("SHOW TABLES;"); 
$row = $statement->fetch(PDO::FETCH_ASSOC); 
echo htmlentities($row['_message']); 
?> 

Sin embargo, sólo las versiones recientes de PHP tienen soporte SSL para PDO, y las opciones de SSL se ignoran silenciosamente en (al menos) la versión 5.3.8: vea el bug report.

¡Buena suerte!

0

Cambie [client] encabezado a [mysqld]. Necesita configurar certificados del lado del servidor allí, no del lado del cliente.

Ver a pleno example de la documentación de MySQL.

También, ver esta pregunta similar: PHP to MySQL SSL Connections

Los certificados de servidor que el servidor pueda responder a las solicitudes SSL, y que no requieren que el cliente tenga un certificado. Cada vez que se conecta a un sitio web a través de HTTPS, está utilizando los certificados del servidor para verificar que se está conectando al servidor correcto y está utilizando la clave pública del certificado para el cifrado.

Los certificados de cliente permiten a un servidor autenticar al cliente.

En su caso, desea certificados de servidor. Desea instalar los certificados en el servidor (MySQL) y el cliente (PHP) podrá autenticar el servidor y usar la clave pública del certificado para configurar el cifrado. Los certificados de los clientes son bastante raros.

Si desea utilizar certificados de cliente, debe usar mysqli o PDO.

+1

Gracias Marcus, pero esta es una configuración del lado del cliente. Después de agregar este parámetro, puedo conectarme al servidor sin agregar --ssl -... params. –

+0

@AlexeyBulash, actualicé mi respuesta para explicar mejor la diferencia entre los certificados de cliente y servidor. –

+0

@MarcusAdams, su enlace está roto ahora. – Henno

Cuestiones relacionadas