PHP MySQL sobre SSL. El certificado de igual no coincide

Estoy tratando de usar Google Cloud SQL sobre SSL de la instancia de GCE (Google Compute Engine). Mi problema es que no puedo conectarme a la instancia de Cloud SQL a través de SSL.

El comando mysql funciona normalmente. Puedo conectarme a la instancia de Cloud SQL con archivos de certificación.

mysql -uroot -p -h [IP Address] --ssl-ca=/home/user/.cert/server-ca.pem --ssl-cert=/home/user/.cert/client-cert.pem  --ssl-key=/home/user/.cert/client-key.pem

Sin embargo, recibí una advertencia y un error fatal como siguientes cuando accedo desde el programa PHP.

<?php
$pdo = new PDO('mysql:host=[IP Address];dbname=testdb', 'root', 'test', array(
    PDO::MYSQL_ATTR_SSL_KEY    =>'/home/user/.cert/client-key.pem',
    PDO::MYSQL_ATTR_SSL_CERT=>'/home/user/.cert/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_CA    =>'/home/user/.cert/server-ca.pem'
    )
);
$stmt = $pdo->query("SHOW TABLES;");
$row = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($row);
?> 

 

PHP Warning:  PDO::__construct(): Peer certificate CN=`[GCP project name]:[Cloud SQL instance name]' did not match expected CN=`[IP Address]' in /tmp/mysql.php on line 7
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2002] ' in /tmp/mysql.php on line 7

Recibí el mismo error cuando usé mysqli.

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

$mysqli->ssl_set('/home/user/.cert/client-key.pem',
                 '/home/user/.cert/client-cert.pem',
                 '/home/user/.cert/server-ca.pem',
                  NULL,NULL);

$mysqli->real_connect('[IP Address]', 'root', 'test', 'testdb', 3306, NULL, MYSQLI_CLIENT_SSL);

 

PHP Warning:  mysqli::real_connect(): Peer certificate CN=`[GCP project name]:[Cloud SQL instance name]' did not match expected CN=`[IP Address]' in /tmp/mysql3.php on line 30
Warning: mysqli::real_connect(): (HY000/2002):  in /tmp/mysql3.php on line 30

Esta pregunta parece ser relevante para mi caso, pero aún no hay respuesta.Certificaciones SSL autofirmadas para conectarse con Mysql con PHP

¿Alguien sabe de soluciones?

Actualización 1

El error es reportado.https://bugs.php.net/bug.php?id=71003

Pregunta muy similar aquí.Google Cloud SQL SSL falla la validación del certificado de igual

Mi versión de PHP es 5.6.14. Actualizaré a 5.6.16 para usar MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT.

Actualización 2

Lo solucioné cuando uso mysqli

Lo que hice son los siguientes:

1 Actualicé mi PHP a 5.6.20

sudo apt-get install php5

2 pongo elMYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT opción como esta.

$mysqli->real_connect('[IP Address]', 'root', 'test', 'testdb', 3306, NULL, MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT);

Mi aplicación usa mysqli y PDO por algunas razones. Ahora estoy buscando la solución de PDO.

Actualización 3

Este informe de error muestra sobre el caso de PDO. Suena aún no arreglado.

https://bugs.php.net/bug.php?id=71845

Esto también está relacionado.https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/google-cloud-sql-discuss/4HNvmq7MpU4/kuSjhkS2AwAJ

Por lo que yo entiendo, no hay forma de resolver PDO.

Actualización 4

Algunas personas culpan al diseño de Google de los nombres CN (estoy de acuerdo con ellos en realidad ...)

Lo peor es que ustedes usan nombres CN imposibles (:). Si el CN no tenía dos puntos, tal vez pueda mapear la ip y el CN en mi archivo de hosts para que cuando se realice la validación de pares pueda pasar. Con los dos puntos, php piensa que es el host y el puerto

y el personal de Google? Entiende el problema.

Entiendo que la situación actual cuando la conexión por IP no es ideal.

Pero parece que proporcionan una solución llamada 'proxy'.

https://groups.google.com/forum/#!topic/google-cloud-sql-discuss/gAzsuCzPlaU

Estoy usando Cloud SQL de segunda generación y mis aplicaciones están alojadas en GCE. Así que creo que puedo usar el proxy. Voy a tratar ahora.

Actualización 5

Configura el acceso proxy. Resuelto el acceso a PDO y mysqli.

Instala el proxy en Ubuntu

$ wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64
$ mv cloud_sql_proxy.linux.amd64 cloud_sql_proxy
$ chmod +x cloud_sql_proxy
$ sudo mkdir /cloudsql; sudo chmod 777 /cloudsql
$ ./cloud_sql_proxy -dir=/cloudsql -instances=<project name>:us-central1:mydb 

DOP

<?php
$pdo = new pdo('mysql:unix_socket=/cloudsql/<project name>:us-central1:mydb;dbname=testdb','root','test');
$stmt = $pdo->query("SHOW TABLES;");
$row = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($row);
?>

mysqli

$mysqli = mysqli_connect('localhost', 'root', 'test', 'testdb', 3306, '/cloudsql/<project name>:us-central1');
$sql = "SELECT id FROM users";
if ($result = $mysqli->query($sql)) {
    while ($row = $result->fetch_assoc()) {
        echo $row["id"] . "\n";
    }
    $result->close();
}
$mysqli->close();

refs (japonés)

http://blog.hrendoh.com/connecting-to-google-cloud-sql-using-mysql-client/ http://blog.hrendoh.com/google-appengine-php-using-cloud-sql/

Respuestas a la pregunta(4)

Su respuesta a la pregunta