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

Antworten auf die Frage(8)

Ihre Antwort auf die Frage