使用 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
,而是尝试require
或allow
:
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 数据库
使用 JDBC 瘦客户端通过 SSL 连接到 Ignite 集群