我正在使用不再维护的旧版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二进制文件和头文件?
答案 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做同样的事情。导出相应的CFLAGS
和LDFLAGS
,然后导出:
./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.ac
,configure
和Makefile
。
然后使用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。