Доброго времени суток! Есть ssl сертификат, раньше все работало, сейчас в одно часе на всех серверах прекратили работать сертификаты(подключение по ним) Пробовал сменить все сертификаты, вплоть да же CA Debian mysqlnd install Прописываю в консоли mysql -p -uuser --ssl-ca=/путь до файла --ssl-key=/путь до файла --ssl-cert=/путь до файла -h127.0.0.1 Через консоль подключаюсь отлично. php code: Код (PHP): ... protected function __construct() { $ssl = array( PDO::MYSQL_ATTR_SSL_KEY =>'/etc/mysq/ssl/client-key.pem', PDO::MYSQL_ATTR_SSL_CERT=>'/etc/mysq/ssl/client-cert.pem', PDO::MYSQL_ATTR_SSL_CA =>'/etc/mysq/ssl/ca-cert.pem' ); try { $this->connection = new PDO('mysql:host=127.0.0.1;dbname='.$this->dbname, $this->user, $this->pass, $ssl); } catch (Exception $e) { ... ошибка: PHP Fatal error: Call to a member function prepare() on null Если выключить сертификаты, подключение к БД работает нормально. Проблема именно в SSL. Но, не знаю, какого именно характера. По ошибке не создается объект, так как нет подключения к БД. Я не понимаю что могло сломаться. Ни чего не меняется уже годами, а тут вот те на... Помогите, кто может!!! Заранее спасибо!
указывает на строку в файле, где подготавливается запрос. Если убрать переменную $ssl из создания подключения, то PHP соединяется с Базой данных и сайт работает в штатном режиме.
это единственное сообщение или перед ним таки есть warning? --- Добавлено --- я думаю, что на строке с new PDO что-то есть
есть Notice. Они и раньше были. Не критичные. Ругается на переменные. --- Добавлено --- А, что там вообще может быть не так? )
ладно, зайдём с другого боку. я вижу у тебя всё обернуто в try-catch. сообщение о возникшем исключении ты увидишь? https://php.ru/manual/pdo.construct.html сделай чтобы точно выбрасывало исключение — через опции и сделай так, чтобы ты увидел сообщение из exception. --- Добавлено --- вот увидишь — расскажешь что там не так они для того и созданы. --- Добавлено --- погуглил по фразе "pdo ssl silent error" и вот тебе на попробовать: http://stackoverflow.com/a/35516709/272885
Через консоль с той же машины, где и PHP заходите? А, локальная машина, не разглядел. --- Добавлено --- А посмотрите, что пишет про SSL команда status, когда заходите через mysql клиент.
А если попробовать этот алгоритм указать в PDO::MYSQL_ATTR_SSL_CIPHER => 'DHE-RSA-AES256-GCM-SHA384' Ну так, как вариант гадания. Хотя мне кажется решение проще. ... /etc/mysq/ssl/ - тут точно опечатки нет?
опечатки нет. Там по правде вообще другой путь. Я его копировал и вставлял в консоль и так проверял, так же зрительно проверил. Все рабочее. Тут я от руки путь вводил и да совершил опечатку. проверил ваш вариант, он не рабочий.. PHP: $ssl = array( PDO::MYSQL_ATTR_SSL_KEY =>'/etc/mysql/ssl/client-key.pem', PDO::MYSQL_ATTR_SSL_CERT=>'/etc/mysql/ssl/client-cert.pem', PDO::MYSQL_ATTR_SSL_CA =>'/etc/mysql/ssl/ca-cert.pem', PDO::MYSQL_ATTR_SSL_CIPHER => 'DHE-RSA-AES256-GCM-SHA384' );
Если тестовый скриптик написать с PDO и его из консоли запустить - тоже ошибка? Я бы еще strace-ом посмотрел процесс PHP, для меня это вообще основной инструмент, когда "какая-то херня" на сервере. Но не знаю, поймете ли его...
в первую очередь ее убрал. То же не работало. С трасером вообще ни когда не работал. (( --- Добавлено --- php5-xdebug установил. Запустил еще раз код php вот содержимое папки /tmp/xdebug.log Log opened at 2016-04-22 15:45:47 I: Connecting to configured address/port: 127.0.0.1:9000. E: Could not connect to client. :-( Log closed at 2016-04-22 15:45:47 --- Добавлено --- время на сервере вообще-то другое. А, тут оно не сходится, при повторном запуске скрипта дублируется эта запись.
@igordata да, есть такая фишка. Странно. У тебя же сервер локальный... Проверь, кстати, ключики доступны аккаунтам из под которых исполняется mysqld и php?
Проверял, ключи для пользователя доступны. --- Добавлено --- от его имени через консоль заходил в базу
Раз уж творится странное, проверять надо всё. Может оказаться, что консоль соединилась в "failback", т.е. секурное соединение обломалось, установлено несекурное. Проверка из работающей консоли: Код (Text): SHOW STATUS LIKE 'Ssl_cipher';
Ssl_cipher | DHE-RSA-AES256-GCM-SHA384 --- Добавлено --- У меня в системе установлен php5-mysqlnd. Вдруг это будет важно для вас. --- Добавлено --- поставил php5.6 и включил вывод ошибок. вот что выдает. 1. Warning: PDO::__construct(): Peer certificate CN=`server.site.ru' did not match expected CN=`127.0.0.1' 2. Warning: PDO::__construct(): Cannot connect to MySQL by using SSL 3. Warning: PDO::__construct(): [2002] (trying to connect via tcp://127.0.0.1:3306) 4. Fatal error: Call to a member function prepare() on null --- Добавлено --- после того, как я в CN сертификата сервера прописал 127.0.0.1 все заработало. Что странно, еще недели две назад и без этого работало. --- Добавлено --- Разве изменились конфигурации сертификатов?
ну что-то определённо изменилось может версия openssl или php или настройки mysql, которые позволяли тебе коннектиться по failback и не замечать этого… главное, что ты теперь знаешь что делать.