如何使用R连接到远程PostgreSQL,需要进行证书验证

时间:2016-03-10 22:46:13

标签: r postgresql ssl

我尝试使用ssl = verify ca模式连接到远程Postgres数据库。我的问题似乎与Connect to Redshift via SSL using RConnect to Postgres via SSL using 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") 

1 个答案:

答案 0 :(得分:5)

根据错误消息,问题是您传递的是用户名和数据库名称的空值。这表明您的实际代码与您在此处输入的内容不符。我会编写一个10行的Rscript程序,它只是连接并抓取一些数据,如下所示:

jQuery(function ($) {

var $container = $('.js-grid').imagesLoaded( function() { 

console.log("images are loaded");
    $container.masonry({
        itemSelector : '.js-masonry',
        columnWidth: 100
    });
    });
});

所以我认为这根本不与SSL证书相关,而是你的变量没有像你想象的那样设置。

编辑:我创建了自己的CA并用它来签署服务器证书和客户端证书。我将Postgres 9.3放在一个新的虚拟机上,并且连接正常,双方都需要证书。我可以连接psql和R.所以我担心我无法重现你的问题。但是你的代码中有一些东西看起来很可疑:

  • 你的路径中只需要一个正斜杠,而不是两个。 (如果你使用反斜杠,你需要两个。)
  • #!/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) 之前需要一个空格,如下所示:

    sslmode

    不是这个:

    'sslcert=pem.crt', ' ',
    

这些更改中的任何一个都可以解决您的问题吗?