使用 R 通过 SSL 连接到 Postgres

Posted

技术标签:

【中文标题】使用 R 通过 SSL 连接到 Postgres【英文标题】:Connect to Postgres via SSL using R 【发布时间】:2015-06-22 20:30:43 【问题描述】:

我也有同样的问题Connect to Redshift via SSL using R

但是,给出的答案需要证书验证。我想知道是否有办法在没有证书验证的情况下做到这一点?当我通过 sql 客户端连接时,我只是添加了这个

?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory

如何在 R 中添加这些参数?

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

https://github.com/r-dbi/RPostgres 在这一点上似乎是更现代和维护的包。这对我有用...

install.packages("RPostgres")
require(RPostgres)

db = dbConnect(
  Postgres(), 
  user = 'user',
  password = 'password',
  dbname = 'dbname',
  host = 'host',
  port = port,
  sslmode = 'require'
)

dbListTables(db)

【讨论】:

这给了我和我的同事错误SSL SYSCALL error: Connection reset by peer,直到我们将RPostgres 升级到版本1.2.0(只能使用从源代码编译选项而不是二进制文件)和然后它起作用了。 可以使用RPostgres v1.2.0验证sslmode是否适合我。 完美解决方案,谢谢! 更新:由于版本中的错误,RPostgres v1.3.1 返回相同的sslmode='require' 错误。见github.com/r-dbi/RPostgres/issues/291【参考方案2】:

不要将verify-full 传递给sslmode,而是尝试requireallow

dbConnect(dbDriver('PostgreSQL'),
    dbname   = 'dbname=foobar sslmode=require',
    host     = 'foobar.redshift.amazonaws.com',
    port     = 5439,
    user     = 'foobar',
    password = 'foobar')

【讨论】:

将 sslmode=require 添加到 dbname 会导致 Rstudio 崩溃 这对我也不起作用,但@chrowe 的解决方案确实有效 我尝试使用上述的 drv 参数 dbDriver('PostgreSQL')RPostgreSQL::PostgreSQL() 在这两种情况下都出现以下错误:Error in postgresqlNewConnection(drv, ...) : RS-DBI driver: (could not connect <user>@<host>:<port> on dbname "<dbname>": sslmode value "require" invalid when SSL support is not compiled in【参考方案3】:

这对我有用:

connection <- DBI::dbConnect(RPostgres::Postgres(),
                             dbname = "dbname",
                             host = "host",
                             port = "port",
                             password = "password",
                             user = "user_name",
                             base::list(sslmode="require", connect_timeout="10"),
                             service = NULL)

所以parameter key words 可以作为列表传递。 这也适用于 RPostgres 1.1.1 和 1.2.0。

【讨论】:

【参考方案4】:

我依赖 R DBI 和 odbc 包。这是我在@Floris的帮助下使用的设置

首先,创建客户端SSL证书和密钥,使用postgres服务器根证书签署客户端证书,并将postgres服务器根证书保存在客户端~/.postgresql/。客户端 ssl 密钥仅由所有者拥有和只读。这是a guide from jealastic.com,我按照它来创建服务器和客户端 SSL 证书。

ls -alh ~/.postgresql/

drwx------  2 foo staff      122 Jul 23 10:45 ./
drwx------ 54 foo staff 2.1K Jul 23 10:45 ../
-rw-r--r--  1 foo staff      875 Jul 21 17:42 postgresql.crt
-rw-r--r--  1 foo staff      631 Jul 21 17:41 postgresql.csr
-r--------  1 foo staff      891 Jul 21 17:41 postgresql.key
-rw-r--r--  1 foo staff     1.1K Jul 21 17:40 root.crt
nano ~/.odbcinst.ini 并添加以下内容:
[PostgreSQL Driver]
Driver              = /home/foo/anaconda3/envs/sql/lib/psqlodbcw.so

odbc 驱动程序使用conda create --name sql -c conda-forge psqlodbc 安装在 conda 环境中。

nano ~/.odbc.ini 并为您希望使用有效凭据连接的数据库添加一个或多个条目:
[foodb]
Driver              = PostgreSQL Driver
Database            = foodb
Servername          = db.example.com
UserName            = foo
Password            = mypassword
Port                = 5432
sslmode             = require

注意 PostgreSQL 驱动程序 匹配 ~/.odbcinst.ini 中的对应条目 对于 sslmode 类型与安全性和开销,这是一个很好的阅读:https://www.postgresql.org/docs/9.4/libpq-ssl.html

修复权限
chmod 600 ~/.odbc.ini ~/.odbcinst.ini
在 RStudio GUI 中,要么创建一个新连接,它应该显示来自 ~/.odbc.ini 的条目 foodb,要么将其输入到 R 控制台中。
library(odbc)
foodb <- dbConnect(odbc::odbc(), "foodb", timeout = 10)

完成!

【讨论】:

以上是关于使用 R 通过 SSL 连接到 Postgres的主要内容,如果未能解决你的问题,请参考以下文章

R RPostgreSQL 使用 SSL 连接到远程 Postgres 数据库

R 可以连接到受 ssl 保护的 MongoDB 实例吗?

使用 JDBC 瘦客户端通过 SSL 连接到 Ignite 集群

通过 SSL 连接到 ZNC

Python stompest 无法通过 SSL 连接到 ActiveMQ

如何使用 Python 通过 SSL 连接到远程 PostgreSQL 数据库