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/