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

Posted

技术标签:

【中文标题】如何使用 libssl 和 libpg 和 SSL 激活编译 RpostgreSQL【英文标题】:How can I compile RpostgreSQL with libssl and libpg and SSL activation 【发布时间】:2017-09-06 13:16:13 【问题描述】:

我在 Windows 上使用 R 连接到托管在 AWS 上的 PostgreSQL 数据库。使用 forcesl = 1 设置数据库 - 这意味着需要使用 sslmode=require 设置任何连接。

基本的RPostgreSQL 包不提供任何ssl 选项。这已多次作为问题提出(参见here、here、here 和here)

我知道使用RPostgres 包有一种解决方法,但出于其他功能原因,我更喜欢使用RPostgreSQL 包。

一些答案​​(例如here)建议使用修改后的 dbname 来连接 ssl,如下所示:

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

但这对我使用 CRAN 版本的软件包不起作用。这让我想到了最近在 RPostgreSQL github 上提出的一个问题:https://github.com/tomoakin/RPostgreSQL/issues/88

初始用户在从源代码编译包时能够使用修改后的 dbname 方法。在 Windows 上,使用 RTools 编译的最新源包(0.6.2),运行修改后的 dbname 代码时出现以下错误:

Error in postgresqlNewConnection(drv, ...) : 
  RS-DBI driver: (could not connect xxxxx.rds.amazonawss.com:5432 on dbname "xxxxxxx": sslmode value "require" invalid when SSL support is not compiled in
)

从这个和线程的其余部分,看起来 SSL 在 Windows 和 Mac 的当前源中都是不可能的。但是,开发者建议:

如果你在libssl和libpq的环境下编译成SSL激活形式,那么驱动就可以使用SSL了。

我认为这意味着我可以手动下载库并自己编译,但我不确定这是否是一个快速修复,或者是否需要对包进行大量重写。任何帮助或指向正确方向将不胜感激。我怎样才能以安全、可重复的方式做到这一点?

【问题讨论】:

您是否设法解决了您在 Windows 上的问题? @JulienNavarre 不,不幸的是没有。看这里:github.com/tomoakin/RPostgreSQL/issues/… 需要的是在包里写一个configure.win文件 【参考方案1】:

通过执行以下操作,我能够为办公室中的 El Capitan macOS R 用户解决此问题:

如果您已经安装了RPostgreSQL R 包,请删除。执行此操作的方法有所不同,但从 R.app 控制台或终端中的 R 键入 remove.packages('RPostgreSQL')

确保您已安装 Homebrew,并从终端运行:brew install libpq openssl

打开 R.app,然后从 Packages & Data 菜单中选择 Package Installer

从第一个下拉菜单中选择CRAN (sources)(如果您以前没有使用过,请选择离您最近的镜像)。

使用包搜索,找到RPostgreSQL,对于下面的选项,保持At System Level处于选中状态,选中Install Dependencies,然后点击Install Selected

退出所有 R 和 RStudio 程序,并尝试使用从源安装的新 RPostgreSQL 包。

免责声明:如果您对其他程序的 OpenSSL 或 libpq 有严重的编译依赖,我不知道执行上述操作会如何破坏其他程序。

【讨论】:

谢谢,但我非常需要在 Windows 上解决这个问题 在重新安装/重建 RPostgreSQL 软件包之前,我还必须通过 Brew 安装 postgresql 软件包,才能获得 SSL 支持。【参考方案2】:

在 Windows 上构建是一堆蠕虫。见R-Admin Windows Toolset。 windows 的唯一 openSSL 二进制文件来自未知的开发人员。在 Windows 上构建和安装 openSSL 是您需要研究的另一种蠕虫病毒。在 R Windows 构建环境中安装 openSSL 可能更容易,但我没有这方面的经验。

编辑:原来在 Windows 上安装 postgres 时,postgres 会安装 openSSL。这意味着 Windows 上的核心问题是为 R 安装 Windows 工具集,安装 postgres,然后将 R 构建系统指向 libpq。

另一种解决方案是在 windows 下的虚拟机中运行 linux。这是Install linux on Windows 的一种方式。对于 linux,根据发行版的不同,您只需要从 linux 命令行执行以下操作(对于 linux 的 RedHat 变体):

sudo yum install openSSL
sudo yum install postgresql96
sudo yum install R

第 2 行安装 RPostgreSQL 所需的 libpq。 libpq 必须使用 openSSL 编译。您将只安装和使用 PostgreSQL 客户端,而不是服务器,并且还将获得 psql。可能需要其他软件包,请参阅R linux toolset。通常,这些将与上述内容一起被拉入,应该不是问题。

RPostgreSQL 包含一个 libpq 版本,但编译脚本看起来不像检查 openSSL,至少在 macOS 上没有。所以安装系统提供的 libpq 很重要。

RPostgreSQL 配置脚本找到 pg_config 也很重要,它是在安装 postgres 客户端时安装的。不确定通过窗户。因此,请确保 pg_config 在您的路径中。输入pg_config 查找。

现在您需要下载并编译 RPostgreSQL。要启动 R,请在 linux 终端输入以下内容。

R

然后从 R 中获取、编译和安装 RPostgreSQL:

install.packages("https://cran.r-project.org/src/contrib/RPostgreSQL_0.6-2.tar.gz", repo=NULL, type="source")

这应该编译和安装这个版本的 RPostgreSQL。如果您正确安装了 windows 工具,那么最后一行应该也可以在 windows 中使用。

希望这能给你一些想法。

【讨论】:

再看这个之后,openssl 似乎不是问题,因为它是从 EnterpriseDB 编译到默认的 Windows 安装中的。但是,在 Windows 上从源代码安装时,该软件包固执地使用捆绑的 libpq 而不是预安装的(即使 pg_config 在我的 PATH 中)。我认为解决这个问题(或找到解决方法)是解决的最后一步 R 路径可能与操作系统路径不同。您需要确保 R 路径包含 pg_config。见biostat.wisc.edu/~kbroman/Rintro/Rwinpack.html 在我的 R GUI 中,Sys.getenv("PATH") 没有返回 pg_config.exe 的位置。 您可以在 R GUI 中尝试类似于 path <- paste(Sys.getenv("PATH"), "C:\\Program Files\\PostgreSQL\\9.6\\bin", collapse=";") Sys.setenv(PATH = path) 的内容。 没有骰子 - pg_config 已经在我的 PATH 中,它仍然使用捆绑版本。由于 RPostgreSQL 中的 configure.win 文件是空的,并且 configure 文件中没有对 Windows 的引用,我觉得从现有的 libpq 安装编译在 Windows 上不起作用。

以上是关于如何使用 libssl 和 libpg 和 SSL 激活编译 RpostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章

链接时ssl版本冲突

节点:重定位错误:节点:符号 SSL_set_cert_cb,版本 libssl.so.10 未在带有链接时间参考的文件 libssl.so.10 中定义

OkHttp + Retrofit libssl 以两种方式崩溃 SSL 身份验证

/usr/local/ssl/lib/libssl.a: error adding symbols: Bad value

FTP实现FTP,SSL加密

centos中缺少libcrypto.so.10 和 libssl.so.10?