【问题标题】:Building Ruby and specifying OpenSSL directory构建 Ruby 并指定 OpenSSL 目录
【发布时间】:2015-10-01 11:02:49
【问题描述】:

我使用的是不再维护的旧版本 ubuntu 10.04。我使用的支付系统最近更新了它的 SST/TLS 证书,现在需要openssl > 1.0.0

我已经下载了最新版本并使用以下命令从头开始构建它:

CFLAGS=-fPIC ./config shared
CFLAGS='$CFLAGS -fPIC -Wl -Bsymbolic' CXXFLAGS='$CXXFLAGS -fPIC -Wl -Bsymbolic' make
make test
make install

运行make install 后,它已将所有文件放在/usr/local/ssl 下。然后我添加了/etc/environment 的新路径,以使操作系统在系统之前找到新版本的 openssl。

我已经安装了 rbenv 和 ruby​​-build 插件,以便从头开始构建 ruby​​,指向新编译的 openssl 库。但是 ruby​​ 不会使用指定的版本,而是使用系统的版本。运行ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION' 报告我仍在使用0.9.8k 版本。用于编译 ruby​​ 的命令如下:

CFLAGS="$CFLAGS -fPIC" RUBY_CONFIGURE_OPTS="--with-openssl-dir=/usr/local/ssl" rbenv install ree-1.8.7-2012.02

我查看了编译器日志,似乎 ruby​​-build 正在使用指定的 ssl 路径。

我也尝试过升级操作系统,但这并没有帮助,因为 10.04 和 12.04 差异很大,而且我在配置文件中有很多冲突。

所以问题是如何编译 openssl 和 ruby​​ 以便 ruby​​ 在编译期间使用指定的 openssl 二进制文件和头文件?

【问题讨论】:

  • “我知道这可能不是 stackoverflow 的正确问题...” 适合我。您有一个CFLAGS,并且正在调用编译器驱动程序。这比这里出现的许多废话更切题。

标签: ruby ubuntu ssl openssl rbenv


【解决方案1】:

所以问题是如何编译 openssl 和 ruby​​ 以便 ruby​​ 在编译期间使用指定的 openssl 二进制文件和头文件?

所以,我的第一反应是迁移到 Ubuntu 14.04。 Ubuntu 14.04 是 LTS,它提供了最新的 OpenSSL。我会跳过 Ubuntu 12.04。除非...


从平台升级开始,首先使用 RPATH 构建 OpenSSL。那是因为 OpenSSL 只为 BSD 启用它们,而不是 Linux。没有它们,libssl 将在/usr/lib 中使用系统的libcrypto,而不是您在/usr/local/ssl/lib 中提供的那个。

要使用 RPATH 构建 OpenSSL,请参阅 Stack Overflow 上的 Build OpenSSL with RPATH? 或 OpenSSL wiki 上的 Compilation and Installation | Using RPATHs

一旦您使用 RPATH 构建 OpenSSL,您就必须为 Ruby 做同样的事情。导出相应的CFLAGSLDFLAGS,然后:

./configure --with-openssl-dir=/usr/local/ssl --prefix=/usr/local
make
sudo make install

我厌倦了所有这些愚蠢的 RPATH/DLL Hell 游戏(是的,即使是 Linux 也会受苦)。我经常这样做是为了完全避免它:

$ cd ruby
$ egrep -IR "(\-lssl|\-lcrypto)" * | cut -d ":" -f 1 | uniq | sort

从中,您将获得链接到 OpenSSL 的文件列表。该列表可能是configure.acconfigureMakefile

然后使用sed通过切入静态存档来去除动态链接部分:

$ sed -i 's|-lssl|/usr/local/ssl/lib/libssl.a|g' configure.ac configure Makefile
$ sed -i 's|-lcrypto|/usr/local/ssl/lib/libcrypto.a|g' configure.ac configure Makefile

然后,所有那些愚蠢的 RPATH 问题都消失了。唯一剩下的就是确保您使用正确的标题。为此,在执行 grep/sed 技巧之后:

$ export CFLAGS="-I/usr/local/ssl/include -I/usr/local/ssl/include/openssl"
$ ./configure --with-openssl-dir=/usr/local/ssl --prefix=/usr/local
$ make
$ sudo make install

安装后,您甚至不会拥有外部 OpenSSL 依赖项。


现在,说了这么多,我只是 downloaded Ruby 2.2.3没有 INSTALL 告诉我们如何配置和构建库。此外,似乎没有使用 OpenSSL 的配置选项:

ruby-2.2.3$ ./configure --help | grep -i ssl
ruby-2.2.3$ ./configure --help | grep -i tls

grep 正在为他们将使用的库找到 0 次点击:

ruby-2.2.3$ grep -IR "\-lssl" *
ruby-2.2.3$ grep -IR "\-lcrypto" *

所以,我不知道该怎么做。

我很久以前就基本上放弃了 Ruby,因为它很难做与设置安全通道相关的最简单的事情,比如禁用 SSLv3、禁用压缩和启用 SNI。例如,在使用 TLS 1.0 及更高版本运行时,请参阅 How to set TLS context options in Ruby (like OpenSSL::SSL::SSL_OP_NO_SSLv2) 和使用 Server Name Indication

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-11
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多