PHP MySQL über SSL. Peer-Zertifikat stimmte nicht mit @ übere
Ich versuche, Google Cloud SQL über SSL von der GCE-Instanz (Google Compute Engine) zu verwenden. Mein Problem ist, dass ich über SSL keine Verbindung zur Cloud SQL-Instanz herstellen kann.
er Befehl @mysql funktioniert normal. Ich kann mit Zertifizierungsdateien eine Verbindung zur Cloud SQL-Instanz herstellen.
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
Ich habe jedoch folgende Warnungen und schwerwiegende Fehler erhalten, wenn ich über ein PHP-Programm zugreife.
<?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
Ich habe den gleichen Fehler erhalten, als ich mysqli verwendet habe.
$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
Diese Frage scheint für meinen Fall relevant zu sein, aber es gibt noch keine Antwort.SSL selbstsignierte Zertifizierungen für die Verbindung mit MySQL mit PHP
Weiß jemand etwas über Lösungen?
Update 1
Der Fehler wird gemeldet.https: //bugs.php.net/bug.php? id = 71003
Sehr ähnliche Frage hier.Google Cloud SQL SSL schlägt bei der Überprüfung des Peer-Zertifikats fehl
Meine PHP-Version ist 5.6.14. Ich werde ein Update auf 5.6.16 durchführen, um MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT zu verwenden.
Update 2
Fixed es, wenn ich mysqli benutze
Was ich getan habe, ist wie folgt:
1 Ich habe mein PHP auf 5.6.20 aktualisiert
sudo apt-get install php5
2 Ich habe das MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT Option wie folgt.
$mysqli->real_connect('[IP Address]', 'root', 'test', 'testdb', 3306, NULL, MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT);
Meine Anwendung verwendet aus bestimmten Gründen sowohl mysqli als auch PDO. Ich bin jetzt auf der Suche nach einer PDO-Lösung.
Update 3
Dieser Fehlerbericht zeigt den Fall von PDO. Klingt noch nicht behoben.
https: //bugs.php.net/bug.php? id = 71845
Dies ist auch verwandt.https: //groups.google.com/forum/? utm_medium = email & utm_source = footer #! msg / google-cloud-sql-discussion / 4HNvmq7MpU4 / kuSjhkS2AwAJ
Soweit ich weiß, kann PDO nicht aufgelöst werden.
Update 4
Einige Leute beschuldigen Googles Design von CN-Namen (ich stimme ihnen tatsächlich zu ..)
Am schlimmsten ist, dass ihr unmögliche CN-Namen verwendet (:). Wenn der CN ohne Doppelpunkt war, kann ich möglicherweise die IP-Adresse und den CN in meiner Hosts-Datei zuordnen, damit sie nach Abschluss der Peer-Validierung übergeben werden können. Mit dem Doppelpunkt, denkt PHP, ist Host und ist Port
und Google-Mitarbeiter? verstehe das Problem.
Ich verstehe die aktuelle Situation, wenn die Verbindung über IP nicht ideal ist.
Aber es scheint, sie bieten eine Lösung namens "Proxy".
https: //groups.google.com/forum/#! topic / google-cloud-sql-discussion / gAzsuCzPlaU
Ich verwende Cloud SQL der zweiten Generation und meine Anwendungen werden von GCE gehostet. Ich denke, ich kann den Proxy-Weg nutzen. Ich werde es jetzt versuchen.
Update 5
Richten Sie den Proxy-Zugriff ein. Behebt sowohl PDO- als auch Mysqli-Zugriff.
Installiere den Proxy auf 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
PDO
<?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 (Japanisch)
http: //blog.hrendoh.com/connecting-to-google-cloud-sql-using-mysql-client http: //blog.hrendoh.com/google-appengine-php-using-cloud-sql