За последние 24 часа нас посетили 15556 программистов и 1552 робота. Сейчас ищут 897 программистов ...

PHP ssl connect to mysql

Тема в разделе "PHP и базы данных", создана пользователем saifuddin, 22 апр 2016.

  1. saifuddin

    saifuddin Новичок

    С нами с:
    5 окт 2013
    Сообщения:
    19
    Симпатии:
    0
    Доброго времени суток!

    Есть ssl сертификат, раньше все работало, сейчас в одно часе на всех серверах прекратили работать сертификаты(подключение по ним)

    Пробовал сменить все сертификаты, вплоть да же CA

    Debian
    mysqlnd install

    Прописываю в консоли mysql -p -uuser --ssl-ca=/путь до файла --ssl-key=/путь до файла --ssl-cert=/путь до файла -h127.0.0.1
    Через консоль подключаюсь отлично.

    php code:
    Код (PHP):
    1. ...
    2. protected function __construct()
    3.         {
    4.                  $ssl =  array(
    5.                  PDO::MYSQL_ATTR_SSL_KEY        =>'/etc/mysq/ssl/client-key.pem',
    6.                  PDO::MYSQL_ATTR_SSL_CERT=>'/etc/mysq/ssl/client-cert.pem',
    7.                  PDO::MYSQL_ATTR_SSL_CA         =>'/etc/mysq/ssl/ca-cert.pem'
    8.         );
    9.                 try {
    10.                         $this->connection = new PDO('mysql:host=127.0.0.1;dbname='.$this->dbname, $this->user, $this->pass, $ssl);
    11.                 } catch (Exception $e) {
    12. ...
    ошибка:
    PHP Fatal error: Call to a member function prepare() on null

    Если выключить сертификаты, подключение к БД работает нормально. Проблема именно в SSL. Но, не знаю, какого именно характера. По ошибке не создается объект, так как нет подключения к БД. Я не понимаю что могло сломаться. Ни чего не меняется уже годами, а тут вот те на...

    Помогите, кто может!!!
    Заранее спасибо!
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    раз объект PDO не создался, наверное он сигналит ошибку. наверное надо её почитать.
     
  3. saifuddin

    saifuddin Новичок

    С нами с:
    5 окт 2013
    Сообщения:
    19
    Симпатии:
    0
    указывает на строку в файле, где подготавливается запрос.

    Если убрать переменную $ssl из создания подключения, то PHP соединяется с Базой данных и сайт работает в штатном режиме.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    это единственное сообщение или перед ним таки есть warning?
    --- Добавлено ---
    я думаю, что на строке с new PDO что-то есть
     
  5. saifuddin

    saifuddin Новичок

    С нами с:
    5 окт 2013
    Сообщения:
    19
    Симпатии:
    0
    есть Notice. Они и раньше были. Не критичные. Ругается на переменные.
    --- Добавлено ---
    А, что там вообще может быть не так? )
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    ладно, зайдём с другого боку. я вижу у тебя всё обернуто в try-catch. сообщение о возникшем исключении ты увидишь?
    https://php.ru/manual/pdo.construct.html
    сделай чтобы точно выбрасывало исключение — через опции и сделай так, чтобы ты увидел сообщение из exception.

    --- Добавлено ---
    вот увидишь — расскажешь что там не так :) они для того и созданы.
    --- Добавлено ---
    погуглил по фразе "pdo ssl silent error" и вот тебе на попробовать:
    http://stackoverflow.com/a/35516709/272885
     
  7. saifuddin

    saifuddin Новичок

    С нами с:
    5 окт 2013
    Сообщения:
    19
    Симпатии:
    0
    Подключение не удалось: SQLSTATE[HY000] [2002] Connection refused

    Вот ошибка.
     
  8. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Через консоль с той же машины, где и PHP заходите?
    А, локальная машина, не разглядел.
    --- Добавлено ---
    А посмотрите, что пишет про SSL команда status, когда заходите через mysql клиент.
     
  9. saifuddin

    saifuddin Новичок

    С нами с:
    5 окт 2013
    Сообщения:
    19
    Симпатии:
    0
    SSL: Cipher in use is DHE-RSA-AES256-GCM-SHA384
     
  10. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    А если попробовать этот алгоритм указать в PDO::MYSQL_ATTR_SSL_CIPHER => 'DHE-RSA-AES256-GCM-SHA384'
    Ну так, как вариант гадания.
    Хотя мне кажется решение проще.
    ...
    /etc/mysq/ssl/ - тут точно опечатки нет?
     
  11. saifuddin

    saifuddin Новичок

    С нами с:
    5 окт 2013
    Сообщения:
    19
    Симпатии:
    0
    опечатки нет. Там по правде вообще другой путь. Я его копировал и вставлял в консоль и так проверял, так же зрительно проверил. Все рабочее. Тут я от руки путь вводил и да совершил опечатку. :)


    проверил ваш вариант, он не рабочий..

    PHP:
    1.                  $ssl =  array(
    2.                  PDO::MYSQL_ATTR_SSL_KEY        =>'/etc/mysql/ssl/client-key.pem',
    3.                  PDO::MYSQL_ATTR_SSL_CERT=>'/etc/mysql/ssl/client-cert.pem',
    4.                  PDO::MYSQL_ATTR_SSL_CA         =>'/etc/mysql/ssl/ca-cert.pem',
    5.                  PDO::MYSQL_ATTR_SSL_CIPHER => 'DHE-RSA-AES256-GCM-SHA384'
    6.         );
     
    #11 saifuddin, 22 апр 2016
    Последнее редактирование модератором: 22 апр 2016
  12. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Если тестовый скриптик написать с PDO и его из консоли запустить - тоже ошибка?
    Я бы еще strace-ом посмотрел процесс PHP, для меня это вообще основной инструмент, когда "какая-то херня" на сервере.
    Но не знаю, поймете ли его...
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    ты пробовал убрать строку с CA?
     
  14. saifuddin

    saifuddin Новичок

    С нами с:
    5 окт 2013
    Сообщения:
    19
    Симпатии:
    0
    в первую очередь ее убрал. То же не работало.

    С трасером вообще ни когда не работал. ((
    --- Добавлено ---
    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

    --- Добавлено ---
    время на сервере вообще-то другое. А, тут оно не сходится, при повторном запуске скрипта дублируется эта запись.
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а что, к мускулу можно через ссл подключаться? я не знал.
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    @igordata да, есть такая фишка.

    Странно. У тебя же сервер локальный...

    Проверь, кстати, ключики доступны аккаунтам из под которых исполняется mysqld и php?
     
  17. saifuddin

    saifuddin Новичок

    С нами с:
    5 окт 2013
    Сообщения:
    19
    Симпатии:
    0
    Проверял, ключи для пользователя доступны.
    --- Добавлено ---
    от его имени через консоль заходил в базу
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Раз уж творится странное, проверять надо всё. Может оказаться, что консоль соединилась в "failback", т.е. секурное соединение обломалось, установлено несекурное. Проверка из работающей консоли:
    Код (Text):
    1. SHOW STATUS LIKE 'Ssl_cipher';
     
  19. saifuddin

    saifuddin Новичок

    С нами с:
    5 окт 2013
    Сообщения:
    19
    Симпатии:
    0
    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 все заработало. Что странно, еще недели две назад и без этого работало.
    --- Добавлено ---
    Разве изменились конфигурации сертификатов?
     
  20. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    ну что-то определённо изменилось :) может версия openssl или php или настройки mysql, которые позволяли тебе коннектиться по failback и не замечать этого…

    главное, что ты теперь знаешь что делать.
     
  21. saifuddin

    saifuddin Новичок

    С нами с:
    5 окт 2013
    Сообщения:
    19
    Симпатии:
    0
    Это верно.
    --- Добавлено ---
    Спасибо что помогали мне разобраться.