Как подключиться к удаленному PostgreSQL с помощью R, требуется проверка сертификата

Я пытаюсь подключиться к удаленной базе данных Postgres в режиме ssl = verify ca. Моя проблема похожа на Подключение к Redshift через SSL с использованием R и подключение к Postgres через SSL с использованием R, но они не работают должным образом. Ошибка всегда

Error in postgresqlNewConnection(drv, ...) : RS-DBI driver: (could not connect (null)@datadb1 on dbname "(null)"

Мой код примерно такой

library("RPostgreSQL")
host = 'datadb1'
dbname = 'test'
port = 5432
password = pw
username = 'pep'

pg_dsn = paste0(
  'dbname=', dbname, ' ',
  'sslrootcert=', "C://root-ca.crt", ' ',
  "sslkey=C://pep.key", " ",
  "sslcert=C://pep.crt", 
  'sslmode=verify-ca'
)
dbConnect(RPostgreSQL::PostgreSQL(), dbname=pg_dsn, host=host, 
          port=port, password=password, user=username)

Однако это не общая проблема с базой данных, потому что я могу подключиться к базе данных с помощью Python. Обновление: я ошибся при указании пути; ошибка на самом деле такова:

Error in postgresqlNewConnection(drv, ...) : RS-DBI driver: (could not connect pep@datadb1 on dbname "test") 

person Alex    schedule 10.03.2016    source источник


Ответы (1)


Судя по сообщению об ошибке, проблема в том, что вы передаете пустые значения имени пользователя и имени базы данных. Это говорит о том, что ваш фактический код не соответствует тому, что вы ввели здесь. Я бы написал 10-строчную программу Rscript, которая просто подключается и получает немного данных, например:

#!/usr/bin/Rscript

library("RPostgreSQL")
host = '192.168.36.2'
dbname = 'test'
port = 5432
password = 'secret'
username = 'pep'

pg_dsn = paste(
                'dbname=', dbname, ' ',
                'sslrootcert=', 'rootCA.pem', ' ',
                'sslkey=pem.key', ' ',
                'sslcert=pem.crt', ' ',
                'sslmode=verify-ca',
                sep=""
                )

conn <- dbConnect(RPostgreSQL::PostgreSQL(), dbname=pg_dsn, host=host,
          port=port, password=password, user=username)
rs <- dbSendQuery(conn, statement="SELECT COUNT(*) FROM users")
data <- fetch(rs, n=1)
dim(data)

Поэтому я не думаю, что это связано вообще с сертификатами SSL, но с тем фактом, что ваши переменные не установлены так, как вы думаете.

EDIT: я создал свой собственный ЦС и использовал его для подписи сертификата сервера и сертификата клиента. Я установил Postgres 9.3 на новую виртуальную машину, и у меня работают соединения с сертификатами, необходимыми с обеих сторон. Я могу подключиться как к psql, так и к R. Боюсь, я не могу воспроизвести вашу проблему. Но некоторые вещи в вашем коде выглядят подозрительно:

  • Вам нужна только одна косая черта в ваших путях, а не две. (Если бы вы использовали обратную косую черту, вам понадобилось бы два.)
  • Вам нужен пробел перед sslmode, например:

    'sslcert=pem.crt', ' ',
    

    не этот:

    'sslcert=pem.crt',
    

Любое из этих изменений решит вашу проблему?

person Paul A Jungwirth    schedule 14.03.2016
comment
Если я просто удалю все сертификаты SSL и запущу приведенный выше код, это будет ошибка: Error in postgresqlNewConnection(drv, ...) : RS-DBI driver: (could not connect pep@datadb1 on dbname "test" ). Кажется, я где-то читал, что RPostgreSQL не поддерживает SSL-соединения, поэтому мне, возможно, придется полностью переключить библиотеку - person Alex; 14.03.2016
comment
Хорошо, отредактировал ответ, чтобы попробовать еще пару вещей. - person Paul A Jungwirth; 14.03.2016
comment
Благодарим вас за то, что вы прошли через трудности с его настройкой, и за ваше терпение. Я сделал два пункта, о которых вы упомянули, но все равно дает ту же ошибку. Я попросил пару человек проверить это на случай, если я что-то пропустил, но нет. Я думаю о том, как сделать воспроизводимый пример, но пока не могу придумать - person Alex; 16.03.2016
comment
Я все еще думаю, что "(null)" в вашем сообщении об ошибке является сильным сигналом о том, что ваши переменные просто не установлены правильно. Я обновил свою тестовую программу, включив в нее сертификаты SSL. Если вы измените имена файлов, чтобы они соответствовали вашим собственным, выдает ли это ту же ошибку? - person Paul A Jungwirth; 16.03.2016
comment
Вы были правы в том, что имена были заданы неправильно. У меня они были в папке c:/db cred, и когда я переместил их только в c:/users/pep, проблема null была решена. Мой плохой, извините. Но ошибка теперь: Error in postgresqlNewConnection(drv, ...) : RS-DBI driver: (could not connect pep@datadb1 on dbname test) - person Alex; 16.03.2016
comment
Поскольку вы смогли подключиться к базе данных, может быть, это потому, что я на Windows? - person Alex; 17.03.2016