php скрипт не может подключиться к MySQL по SSL - PullRequest
0 голосов
/ 26 февраля 2019

Сценарий, приведенный ниже, выполняется на сервере Centos и пытается подключиться к базе данных MySQL на другом сервере, для которого требуются параметры SSL.Учетные данные, используемые в сценарии, работают нормально при использовании DSN-подключения Microsoft Access.

<?php
ini_set ('error_reporting', E_ALL);
ini_set ('display_errors', '1');
error_reporting (E_ALL|E_STRICT);

$pdo = new PDO('mysql:host=99.99.199.199;dbname=dummy1', 'user1', 'pwd1', 
array(
    PDO::MYSQL_ATTR_SSL_KEY    =>'/etc/mysql/ssl/ck.pem',
    PDO::MYSQL_ATTR_SSL_CERT=>'/etc/mysql/ssl/cc.pem',
    PDO::MYSQL_ATTR_SSL_CA    =>'/etc/mysql/ssl/c1.pem'
));
$statement = $pdo->query("SHOW TABLES;");
$row = $statement->fetch(PDO::FETCH_ASSOC);
echo htmlentities($row['_message']);
?>

Приведенный выше код дает сбой операции SSL с кодом 1 - вот полное сообщение:

Неустранимая ошибка: Uncaught PDOException: PDO :: __ construct (): операция SSL не выполнена с кодом 1. OpenSSL Сообщения об ошибках: ошибка: 14090086: процедуры SSL: ssl3_get_server_certificate: сбой проверки сертификата в / var / www / vhosts /zzzzz.org/httpdocs/zzodbc/dgodbc1.php:10 Трассировка стека: # 0 /var/www/vhosts/zzzzz.org/httpdocs/zzodbc/dgodbc1.php(10): PDO -> __ construct ('mysql: host =99.9 ... ',' odbc_guil ... ',' pwd1 ', Array) # 1 {main} Следующее исключение PDO: SQLSTATE [HY000] [2002] в /var/www/vhosts/zzzzz.org/httpdocs/zzodbc/dgodbc1.php: 10 Трассировка стека: # 0 /var/www/vhosts/zzzzz.org/httpdocs/zzodbc/dgodbc1.php(10): PDO -> __ construct ('mysql: host = 99.9 ...', 'odbc_guil... ',' pwd1 ', Array) # 1 {main} добавлено в /var/www/vhosts/zzzzz.org/httpdocs/zzodbc/dgodbc1.php в строке 10

У меня естьпроверено гона учетные данные, в том числе параметры SSL с подключением DSN.Я проверил, что ключи SSL правильно расположены в каталоге / etc / mysql / ssl .

Любая помощь, чтобы подсказать, что я делаю неправильно, будет хорошей.Спасибо.

Возможно, я ошибся в этом .... Так как эти ключи работают с ODBC, я думаю, что я должен использовать odbc_connect и посылать ту же строку, что иЯ использую с MS-доступом, таким как

$user = "user";
$pass = "pwd";

$connection = "Driver={MySQL ODBC 5.1 Driver};Server=46.51.178.163;Database=db1;sslca=/etc/mysql/ssl/c1.pem;sslkey=/etc/mysql/ssl/ck.pem;sslcapath=/etc/mysql/ssl/;sslcert=/etc/mysql/ssl/cc.pem";

$con = odbc_connect($connection, $user, $pass);

Но чтобы заставить это работать, мне нужно установить MySQL-коннектор на сервере, с которым я сейчас работаю.

1 Ответ

0 голосов
/ 16 марта 2019

Я решил эту проблему - спасибо всем, кто помог.Вот что я узнал:

  • Ключи SSL специфичны для типа соединения - поэтому у меня были ключи, которые работали с ODBC, и было неправильно ожидать, что они будут работать с PDO
  • Драйверы ODBC (расширения php) должны быть установлены на сервере - они не присутствуют автоматически. Здесь - отличное видео, показывающее, как это сделать.
  • Вам необходим доступ из командной строки к серверу для установки драйвера (а также для загрузки ключей SSL в безопасное место) - они находятся в /etc/mysql/ssl.
  • Я установилдрайвер в / usr / lib / odbc2 / lib, а не в длинном имени папки в видео.Я также установил в / usr дерево , потому что, когда я пробовал местоположения в видео, я обнаружил, что файл не найден.Два файла драйвера: libmyodbc5a.so и libodbc5w.so .Кажется, требуется только файл ... 5w.so.
  • Как только эти файлы будут созданы, вам нужно добавить запись в odbcinst.ini в / etcпапка.Я использовал nano, поэтому в командной строке nano odbcinst.ini выводится файл, в котором была запись модели для PostgresSQL.Если сервер 64-битный, то это записи, которые я сделал в odbcinst.ini: [mysql537] Driver64 = /usr/lib/odbc2/lib/libmyodbc5w.so Setup64 = /usr/lib/odbc2/lib/libmyodbc5w.so UsageCount= 1

  • Вы должны иметь ... 64 путей , в противном случае драйвер не найден (т. Е. Driver64 = NOT Driver =).Сначала я сделал эту ошибку.

  • Если файлы драйвера находятся по пути в odbcinst.ini, то все должно работать.(Я думал, что мне нужны записи в odbc.ini, но теперь я считаю, что вам нужно что-то здесь, только если вы используете DSN).
  • папка odbc2 была той, которую я создал внутри / etc / lib , которая уже существует.Я сделал это, чтобы избежать проблем с разрешениями, создав новую папку.

Вот код, который работает (строка подключения в точности совпадает со строкой, используемой в соединении Microsoft Access):

<?php
ini_set ('error_reporting', E_ALL);
ini_set ('display_errors', '1');
error_reporting (E_ALL|E_STRICT);

$user = "odbcmmm";
$pass = "999999999";

$connection = "Driver={mysql537};Server=99.99.199.199;Database=db_name;UID=odbc_db_name;PWD=password;sslca=/etc/mysql/ssl/c1.pem;sslkey=/etc/mysql/ssl/ck.pem;sslcapath=/etc/mysql/ssl/;sslcert=/etc/mysql/ssl/cc.pem";

$con = odbc_connect($connection, $user, $pass);

$sql="SELECT Id from stk_item"; 
$rs=odbc_exec($con,$sql);

if (!$rs)   {
exit("Error in SQL");
}

Надеюсь, это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...