PHP MySQL через SSL. Сертификат пэра не совпадает

Я пытаюсь использовать Google Cloud SQL поверх SSL из экземпляра GCE (Google Compute Engine). Моя проблема в том, что я не могу подключиться к экземпляру Cloud SQL через SSL.

команда mysql работает нормально. Я могу подключиться к экземпляру Cloud SQL с помощью файлов сертификации.

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

Тем не менее, я получил предупреждение и фатальную ошибку, как следующие, когда я получаю доступ из программы 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

Я получил ту же ошибку, когда я использовал MySQL.

$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

Этот вопрос выглядит актуальным для моего случая, но ответа пока нет.Самоподписанные сертификаты SSL для соединения с Mysql с PHP

Кто-нибудь знает о решениях?

Обновление 1

Об ошибке сообщается.https://bugs.php.net/bug.php?id=71003

Очень похожий вопрос здесь.Google Cloud SQL SSL не проходит проверку сертификата одноранговой сети

Моя версия PHP 5.6.14. Я обновлюсь до 5.6.16, чтобы использовать MYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT.

Обновление 2

Исправлено, когда я использую mysqli

Я сделал следующее:

1 Я обновил свой PHP до 5.6.20

sudo apt-get install php5

2 Я положилMYSQLI_CLIENT_SSL_DONT_VERIFY_SERVER_CERT вариант как этот.

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

Мое приложение использует MySQL и PDO по некоторым причинам. Я сейчас ищу решение PDO.

Обновление 3

Этот отчет об ошибке показывает случай PDO. Звуки еще не исправлены.

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

Это тоже связано.https://groups.google.com/forum/?utm_medium=email&utm_source=footer#!msg/google-cloud-sql-discuss/4HNvmq7MpU4/kuSjhkS2AwAJ

Насколько я понимаю, нет способа решить для PDO.

Обновление 4

Некоторые люди обвиняют Google в дизайне имен CN (на самом деле я согласен с ними ..)

Что хуже всего, вы, ребята, используете невозможные имена CN (:). Если CN был без двоеточия, возможно, я могу отобразить ip и CN в моем файле hosts так, чтобы когда проверка пира была выполнена, он мог пройти. С двоеточием php считает хост и порт

а сотрудники гугл? понять проблему.

Я понимаю сложившуюся ситуацию, когда подключение по IP не идеальное.

Но, похоже, они предоставляют решение под названием «прокси».

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

Я использую Cloud SQL второго поколения, и мои приложения размещены в GCE. Поэтому я думаю, что могу использовать прокси-способ. Я попробую это сейчас.

Обновление 5

Настройте доступ прокси. Решены как PDO, так и доступ mysqli.

Установите прокси на 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 (японский)

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

Ответы на вопрос(4)

Ваш ответ на вопрос