Мы только что обновились до php 5.6 от PHP 5.4, и все работало нормально с подключением MySQL с использованием MySQLi и SSL.
Наша связь выглядит так:
mysqli_real_connect($db, $host, $username, $password, $database, $port, $socket, MYSQLI_CLIENT_SSL);
mysqli_set_charset($db, "utf8");
Но теперь, когда мы пытаемся подключиться к MySQL через SSL, используя php 5.6, мы получаем:
Предупреждение: mysqli_real_connect (): операция SSL не выполнена с кодом 1.
Сообщения об ошибках OpenSSL: ошибка: 14090086: SSL
подпрограммы: SSL3_GET_SERVER_CERTIFICATE: сбой проверки сертификата в
/MySQLConnection.php в строке 29Предупреждение: mysqli_real_connect (): невозможно подключиться к MySQL с помощью SSL
в /MySQLConnection.php в строке 29Предупреждение: mysqli_real_connect (): [2002] (пытается подключиться через
tcp: //mysql1.ourdomain.com: 3306) в /MySQLConnection.php в строке 29Предупреждение: mysqli_real_connect (): (HY000 / 2002): в /MySQLConnection.php
на линии 29
Я попытался установить:
mysqli_options($db, MYSQLI_OPT_SSL_VERIFY_SERVER_CERT, false);
Но это не помогает.
Я добавил:
$mysql_certs_path = "/full/path/to/certs/mysql";
mysqli_ssl_set($db, $mysql_certs_path . "/client-key.pem", $mysql_certs_path . "/client-cert.pem", $mysql_certs_path . "/ca-cert.pem", null, null);
И все еще получаю:
Предупреждение: mysqli_real_connect (): операция SSL не выполнена с кодом 1.
Сообщения об ошибках OpenSSL: ошибка: 14090086: SSL
подпрограммы: SSL3_GET_SERVER_CERTIFICATE: сбой проверки сертификата в
/MySQLConnection.php в строке 31Warning: mysqli_real_connect(): Cannot connect to MySQL by using SSL in /MySQLConnection.php on line 31
@jww, я написал пост, в котором точно описаны проблемы, с которыми сталкивается @Justin. В соответствии с мой пост, CN сертификата, выданного Google Cloud SQL, имеет вид:
CN=project-name:instance-id
Случилось ли что-то подобное со мной? Когда я обновил PHP до 5.6, это сработало. Но когда я вошел:
sudo apt-get install php5-mysqlnd
В Ubuntu 15.04 перестал работать SSL для AWS RDS, хотя он работал с драйвером libmysql. Бег:
sudo apt-get install php5-mysql
Установил старые драйверы и он снова начал работать. Насколько я могу понять, он не проходит проверку однорангового имени для подключения к RDS. Я не знаю, как это исправить, и поскольку он использует потоки PHP для своего соединения, настройки, кажется, не имеют значения, что вы передаете.
Это известная ошибка:
https://bugs.php.net/bug.php?id=68344
Итак, я написал этот метод, модифицированный отсюда: Как узнать, является ли MySQLnd активным драйвером?
public function getMySQLIType()
{
$mysqlType = [
'mysql' => false,
'mysqli' => false,
'mysqlnd' => false,
];
if (function_exists('mysql_connect')) {
$mysqlType['mysql'] = true;
}
if (function_exists('mysqli_connect')) {
$mysqlType['mysqli'] = true;
}
if (function_exists('mysqli_get_client_stats')) {
$mysqlType['mysqlnd'] = true;
}
return $mysqlType;
}
Если массив возвращает true для mysqlnd, я отключаю SSL. Если возвращает false, то я включаю его. Пока что это работает. Да, это хакерское исправление, но я не знаю, как законно решить эту проблему.