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

Posted

技术标签:

【中文标题】R RPostgreSQL 使用 SSL 连接到远程 Postgres 数据库【英文标题】:R RPostgreSQL Connect to Remote Postgres Database with SSL 【发布时间】:2017-09-04 05:38:39 【问题描述】:

我正在尝试使用 RPostgreSQL 包从 R 中连接到远程 PostgreSQL 数据库,但我收到的错误似乎与连接的 SSL 设置有关。我已经验证我可以使用psql 从命令行进行连接,所以我知道连接是有效的并且可以从我的计算机访问。

我在 R 中的第一次连接尝试如下(其中 <MyHost><MyPass> 为我的连接正确填写):

library(RPostgreSQL)
pg <- dbDriver( 'PostgreSQL' )
con = dbConnect( pg, host=<MyHost>, dbname='warehouse', 
                 user='warehouse', password=<MyPass>, port=5432 )

我在 R 中收到的错误是:

RS-DBI driver: (could not connect warehouse@<MyHost>.com:5432 on 
dbname "warehouse": FATAL:  no pg_hba.conf entry for host "75.166.243.177", 
user "warehouse", database "warehouse", SSL off

我理解这意味着我需要对我的连接应用 SSL 加密,因此我尝试了以下方法,这似乎适用于此处的 OP:Connect to Postgres via SSL using R

library(RPostgreSQL)
pg <- dbDriver( 'PostgreSQL' )
con = dbConnect( pg, host=<MyHost>, dbname='dbname=warehouse sslmode=require', 
                 user='warehouse', password=<MyPass>, port=5432 )

我收到的错误是:

RS-DBI driver: (could not connect warehouse@<MyHost>:5432 on dbname 
"warehouse": sslmode value "require" invalid when SSL support is not 
compiled in

我发现这篇文章 (Postgres SSLMode Value "require" Invalid When SSL Support Is Not Compiled Using Foreign Data Wrapper) 表明我的 PostgreSQL 构建在编译时可能没有包含 --with-openssl 标志,但运行 pg_config 显示该标志确实在我的构建中设置。这是有道理的,因为当我使用 psql 命令行工具时,我能够使用 SSL 连接到数据库。

担心我的 PostgreSQL 安装可能有问题,我完全删除了它。然后我运行了上述两个 R 代码的 sn-ps,只是为了好玩,我收到了完全相同的错误。我没想到会这样,但这似乎表明(a)我不需要本地安装 PostgreSQL 才能使用 RPostgreSQL 包,或者(b)我在计算机上的其他地方安装了令人困惑的 PostgreSQL这不是包含--with-openssl标志的。我在命令行中尝试过locate postgresql,但没有看到任何看起来像是单独安装的明显内容。无论如何,我仍然无法从 R 中成功连接到远程 PostgreSQL 数据库。

我在这里搜索了 Stack Overflow 以获得洞察力,似乎存在许多类似性质的未解决问题,即用户由于某种原因无法与远程服务器建立连接。我尝试安装 Kirill Müller 在这里维护的 RPostgres 包 (https://github.com/rstats-db/RPostgres),但我无法让 R 包安装来识别我的本地 PostgreSQL 安装,即使在尝试使用 R CMD INSTALL 手动指定包含和 lib 路径之后也是如此,正如由此产生的错误消息所建议的那样(虽然我可能在这里遗漏了一些东西......)。听起来有些用户使用RPostgres 比使用RPostgreSQL 更幸运,但同样,我无法安装此软件包。

我不知道还能做什么,如果我不知道如何尽快建立连接,我将不得不求助于其他技术。任何帮助将不胜感激。

【问题讨论】:

这里有更多信息。我为已安装的RPostgreSQL 包运行otool -L RPostgreSQL.so,输出指向/usr/lib/libpq.5.dylibotool 是Linux 的ldd 的Mac 版本,用于查找二进制文件链接到的库)。这不是在我安装的 Postgres.app 中libpq 的位置,这里是:/Applications/Postgres.app/Contents/Versions/9.6/lib/libpq.5.dylib。我不知道/usr/lib 中的版本来自哪里,但它似乎没有使用 SSL 支持编译;这就是 RPostgreSQL 正在使用的。如何强制RPosgreSQL 使用另一个libpq.5.dylib 这似乎是一个较老的问题,但仍然相关。我正在尝试运行相同的连接命令:library(RPostgreSQL) pg &lt;- dbDriver( 'PostgreSQL' ) con = dbConnect( pg, host=&lt;MyHost&gt;, dbname='dbname=&lt;dbname&gt; sslmode=require', user='&lt;user&gt;', password=&lt;pass&gt;, port=&lt;port&gt; ) 并得到相同的“未编译 SSL 支持”错误。我没有/Applications/Postgres.app 目录并且 otool 没有找到 RPostgreSQL.so RPostgreSQL 代码显示了一个参数 USE_SSL,如果未定义 (github.com/cran/RPostgreSQL/blob/…) 将导致错误消息 (github.com/cran/RPostgreSQL/blob/…)。 USE_SSL 是如何定义/确定的? 【参考方案1】:

感谢发帖!你实际上帮助我们解决了它。以下是我们的做法:

通过重新启动计算机并按住 Command+R 直到 Apple 徽标出现在屏幕上,将 Mac 重新启动到恢复模式。 点击Utilities > Terminal。 在终端窗口中,输入csrutil disable 并按 Enter。 重新启动您的 Mac。 打开一个终端。 运行sudo rm /usr/lib/libpq.5.dylib 运行sudo ln -s /Applications/Postgres.app/Contents/Versions/9.6/lib/libpq.5‌​.dylib 现在您可以连接到数据库了。

【讨论】:

感谢您的回复。是否需要使用 csrutil disable 关闭 Mac 的系统完整性保护 (SIP),以便操作系统允许您删除 /usr/lib/libpq.5.dylib?也就是说,一旦我删除了这个文件(或者至少重命名它直到我确定我不需要它),我可以运行csrutil enable 重新启用 SIP 吗?

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

如何使用 libssl 和 libpg 和 SSL 激活编译 RpostgreSQL

如何使用 dplyr 和 RPostgreSQL 将 r 连接到 redshift?

使用 dplyr 连接到 SSL 加密的远程数据库

R 在使用 dplyr 或 RPostgreSQL 的模式下访问 redshift 表

无法使用 RPostgreSQL 连接到 AWS Redshift

在 R 中使用 ssh 隧道连接到数据库 PostSQL