2015-03-25 2 views
3

У меня проблема с MySQL на PHP 5.6, и после трех дней отладки PHP, OpenSSL, MySQLnd Drivers на PHP и тестирования mysql_client на машине Ubuntu 14.04, я пришел к вывод: SSL-сертификаты Google Cloud SQL не будут работать на PHP 5.6 и выше.Google Cloud SQL SSL не удалось проверить сертификат одноранговой сети

Для начала облако Google - отличный сервис, и современная криптография применяется во всей экосистеме Google. Однако я не мог использовать его из-за одной небольшой проблемы: сертификаты Google Cloud SQL SSL Server не имеют общих имен.

Google Cloud SQL Server (или равный) сертификаты имеют общее имя (CN), который выглядит примерно так:

CN=project-name:instance-id 

В довершение, начиная с PHP 5.6, все зашифрованные клиентские потоки будут проходить обязательный проверка сертификата партнера. (Ссылка: OpenSSL changes in PHP 5.6.x). Я использую расширение объектов данных PHP (PDO), которое использует собственный драйвер MySQLnd для обработки всего бизнеса MySQL. Для обработки этих соединений используются собственные потоки PHP.

Я просматривал исходный код MySQLnd на PHP (ссылка: MYSQLnd Driver Code on GitHub), параметры конфигурации MySQLnd, чтобы попытаться отключить код проверки подлинности SSL на этом конкретном MySQLND. Но безрезультатно.

Поэтому, что мне делать, если мне нужно использовать SSL для соединений MySQL на PHP 5.6?

Ваш отзыв очень ценится!

+0

В http://php.net/manual/en/migration56.openssl.php вы можете найти " Все потоковые клиентские потоки теперь позволяют проверять сверку по умолчанию »и« Хотя это и не рекомендуется в целом, можно отключить проверку сертификатов однорангового узла для запроса, установив параметр контекста verify_peer в FALSE и отключить проверку имени пэра, установив параметр контекста verify_peer_name to FALSE ", не могли бы вы попробовать, чтобы посмотреть, работает ли это для вас? – Mario

+0

Привет Марио, спасибо за ваш ответ. Я использую PDO PHP для обработки транзакций с базами данных. Согласно [PHP PDO_MYSQL документации драйвера] (http://php.net/manual/en/ref.pdo-mysql.php), существуют опции для CA, Client cert и key. Не существует опции для проверки SSL. PDO_MYSQL использует mysqlnd, а [mysqlnd использует собственные php-потоки] (http://php.net/manual/en/mysqlnd.notes.php).Это означает, что в соответствии с приведенной выше ссылкой на исходный код (код драйвера MySQLnd ...) они обрабатывают его внутренне. Я не мог найти способ изменить параметр контекста verify_peer_name, не входя в PHP-источник afaik ... – watonlyme

+0

Связано: http://stackoverflow.com/q/28777416/3645370 – David

ответ

1

Попробуйте подключить через прокси-сервер, если у вас есть второе поколение SQL, вы можете быть в состоянии соединить ПДО с 127.0.0.1 через прокси-сервер: https://cloud.google.com/sql/docs/compute-engine-access#gce-connect-proxy

+0

Действительно, прокси Cloud SQL предоставляется в качестве решения для этих сценариев где прямая аутентификация для Cloud SQL невозможна. Документ «Подключение MySQL-клиента с использованием Cloud SQL Proxy» также дает хороший общий обзор того, как он работает. Это по сути то же самое, что и подключение к локальному экземпляру MySQL без auth. https://cloud.google.com/sql/docs/mysql-connect-proxy – Adam

+0

Да, у меня была такая же проблема с php 7.0, и я использовал прокси-сервер google. Я также считаю, что он правильно обрабатывает балансировку нагрузки на master sql, когда у вас есть данные для чтения или восстановления после сбоя. Я использую прокси-сервер в производстве в течение одной недели, и он оказался более разумным. Вы можете обнаружить, что нет инструкций о том, как запустить процесс демона прокси-сервера sql в фоновом режиме, но для этого нужно всего лишь час. –

0

Предполагая, что вы можете убедить MySQL, что имя хоста должен проверить это на самом деле project-name:instance-id, то я бы подумал, что проверка имени хоста должна быть успешной (хотя я согласен, что сертификат не выглядит великолепно).

Я попытался выполнить следующие действия на своей рабочей станции Mac OS X, и, похоже, это удалось, по крайней мере, при использовании двоичного файла mysql (я не пробовал через PHP).

Сначала я добавил запись хостов на моей машине включил двоеточие как часть имени:

1.2.3.4 project-name:instance-id 

После этого я смог успешно соединиться с MySQL (5.6.32), установленной на моей машине :

mysql -uroot -h "project-name:instance-id" --password \ 
    --ssl \ 
    --ssl-ca ~/Downloads/server-ca.pem \ 
    --ssl-cert ~/Downloads/client-cert.pem \ 
    --ssl-key ~/Downloads/client-key.pem \ 
    --ssl-verify-server-cert 

(Когда я побежал, что та же команда с IP-адресом вместо этого, я получил ERROR 2026 (HY000): SSL connection error: SSL certificate validation failure)