Не удалось подключиться к внешней базе данных SSL Postgres с Debian (ошибки разрешения сертификата)

проблема

Пример скрипта

<?php // define constants define('DB_HOST', '1.1.1.1'); define('DB_USER', 'usr'); define('DB_PASS', 'pw'); define('DB_NAME', 'db'); define('DB_PORT', '5432'); // connection string with SSL certificate files $conn_str = 'host=' . DB_HOST . ' '; $conn_str .= 'port=' . DB_PORT . ' '; $conn_str .= 'dbname=' . DB_NAME . ' '; $conn_str .= 'user=' . DB_USER . ' '; $conn_str .= 'password=' . DB_PASS . ' '; $conn_str .= 'sslmode=verify-full '; $conn_str .= 'sslcert=etc/apache/ssl/postgresql.crt '; $conn_str .= 'sslkey=etc/apache/ssl/postgresql.key '; $conn_str .= 'sslrootcert=etc/apache/ssl/root.key '; // attempt connection $conn = pg_connect($conn_str) or die('Cannot connect to database.'); // set sql string $sql = 'SELECT * FROM locations;'; // query and iterate results if($result = pg_query($conn, $sql)) while($row=pg_fetch_row($result)) { var_dump($row); } // close it up pg_close(); ?> 

Я могу подключиться к внешней базе данных SSL Postgres, используя xampp и PHP, но когда я пытаюсь использовать ее на моем сервере debian linux, я не могу установить соединение.

Я подозреваю, что это проблема или разрешения. Я поместил свои сертификаты в / var / www / html и / etc / ssl, но ни один из путей на моем рабочем сервере не работал. В xampp я просто указываю c: /xampp/htdocs/certs.key/.crt, и они работают нормально.

Что может вызвать проблему на моем рабочем сервере?

Решение (частично)

Поскольку pg_last_error () и pg_errormessage () не возвращают ошибки для попыток подключения, мне пришлось создать настраиваемый обработчик исключений. Я применил специальный обработчик исключений и, наконец, получил ошибку:

 "pg_connect(): Unable to connect to PostgreSQL server: private key file "/etc/apache2/ssl/postgresql.key" has group or world access; permissions should be u=rw (0600) or less" 

Затем я попытался CHMOD ключ / crt

 sudo chmod 0600 /etc/apache2/ssl/postgresql.crt sudo chmod 0600 /etc/apache2/ssl/postgresql.key 

Это дало мне ошибку

 pg_connect(): Unable to connect to PostgreSQL server: could not read certificate file "/etc/apache2/ssl/postgresql.crt": Permission denied 

Я использовал команду linux 'ls -la', я заметил, что я был владельцем, поэтому я chown'd.

 chown root:root /etc/apache2/ssl/postgresql.crt chown root:root /etc/apache2/ssl/postgresql.key 

Хорошо, что это не сработало, я добавил в свой PHP-скрипт

 echo exec('whoami'); 

Это выдало «www-data», ОК, поэтому я ввел

 sudo chown -R www-data:www-data /etc/ssl/ chmod 700 /etc/ssl/ 

Наконец это сработало! Не уверен в безопасности этого, но это мое временное решение.

Окончательный сценарий

 <?php // Create a custom exception error handler for pg_connect function exception_error_handler($errno, $errstr, $errfile, $errline ) { throw new ErrorException($errstr, $errno, 0, $errfile, $errline); } // Set the error handler set_error_handler("exception_error_handler"); // Force output of all errors error_reporting(E_ALL); // Define constants define('DB_HOST', '1.1.1.1'); define('DB_USER', 'USR'); define('DB_PASS', 'PW'); define('DB_NAME', 'DB'); define('DB_PORT', '5432'); // Connection string with SSL certificate files $conn_str = 'host=' . DB_HOST . ' '; $conn_str .= 'port=' . DB_PORT . ' '; $conn_str .= 'dbname=' . DB_NAME . ' '; $conn_str .= 'user=' . DB_USER . ' '; $conn_str .= 'password=' . DB_PASS . ' '; $conn_str .= 'sslmode=require '; $conn_str .= 'sslcert=/etc/apache2/ssl/postgresql.crt '; $conn_str .= 'sslkey=/etc/apache2/ssl/postgresql.key '; // Try catch block grabbing stored exception try { echo "Attempting pg_connect: " . $conn_str . "<br>"; $conn=@pg_connect($conn_str); } catch (Exception $e) { echo $e->getMessage(); } // Attempt Connection $conn = pg_connect($conn_str) or die('Cannot connect to database.'); // Set SQL String $sql = 'SELECT * FROM locations'; // Attempt query and iterate results if(result = pg_query($conn, $sql)) while($row=pg_fetch_row($result)) { var_dump($row); } // Close it up pg_close(); ?>