构建Ruby并指定OpenSSL目录

时间:2015-10-01 11:02:49

标签: ruby ubuntu ssl openssl rbenv

我正在使用不再维护的旧版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插件,用于从头开始构建指向新编译的openssl库的ruby。但是,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二进制文件和头文件?

1 个答案:

答案 0 :(得分:0)

  

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

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

从平台升级开始,首先使用RPATH构建OpenSSL。那是因为OpenSSL只为BSD启用它们,而不是Linux。如果没有它们,libssl将使用libcrypto中的系统/usr/lib,而不是/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地狱游戏(是的,甚至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