【问题标题】:Building ruby with rbenv and ruby-build fails with undefined symbol: SSLv2_method使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,符号未定义:SSLv2_method
【发布时间】:2016-03-29 13:54:18
【问题描述】:

我正在尝试在配备 ARMv7 处理器的 Synology DS215j 上安装 ruby​​ 2.2.4 或 2.3.0。我使用optware-ng 安装 gcc、make、openssl、openssl-dev 和 zlib。我按照README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby-build插件。

这些是使用 optware-ng 安装的软件包及其版本

binutils - 2.25.1-1
gcc - 5.3.0-6
gconv-modules - 2.21-3
glibc-opt - 2.21-4
libc-dev - 2.21-1
libgmp - 6.0.0a-1
libmpc - 1.0.2-1
libmpfr - 3.1.3-1
libnsl - 2.21-3
libstdc++ - 6.0.21-6
make - 4.1-1
ncurses - 5.7-4
openssl - 1.0.2f-1
openssl-dev - 1.0.2f-1
readline - 6.1-2
ruby - 2.2.0-1
screen - 4.2.1-2
termcap - 1.3.1-3
zlib - 1.2.8-2

当我在这两种情况下运行 rbenv install 2.2.4rbenv install 2.3.0 时,构建失败并显示错误消息“未定义符号:SSLv2_method”。这是 2.2.4 版本的错误:

installing bundle gems:       /var/services/homes/florian/.rbenv/versions/2.2.4/lib/ruby/gems/2.2.0 (build_info, cache, doc, extensions, gems, specifications)
/tmp/ruby-build.20160329115213.2672/ruby-2.2.4/lib/rubygems/core_ext/kernel_require.rb:54:in `require': /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/.ext/armv7l-linux-eabihf/openssl.so: undefined symbol: SSLv2_method - /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/.ext/armv7l-linux-eabihf/openssl.so (LoadError)
    from /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/lib/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/.ext/common/openssl.rb:17:in `<top (required)>'
    from /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/lib/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/lib/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/lib/rubygems/security.rb:11:in `<top (required)>'
    from /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/lib/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/lib/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/lib/rubygems/package.rb:43:in `<top (required)>'
    from /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/lib/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/lib/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/lib/rubygems/dependency_installer.rb:3:in `<top (required)>'
    from /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/lib/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/lib/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /tmp/ruby-build.20160329115213.2672/ruby-2.2.4/lib/rubygems.rb:556:in `install'
    from ./tool/rbinstall.rb:722:in `block (2 levels) in <main>'
    from ./tool/rbinstall.rb:721:in `each'
    from ./tool/rbinstall.rb:721:in `block in <main>'
    from ./tool/rbinstall.rb:757:in `call'
    from ./tool/rbinstall.rb:757:in `block in <main>'
    from ./tool/rbinstall.rb:754:in `each'
    from ./tool/rbinstall.rb:754:in `<main>'
uncommon.mk:246: recipe for target 'do-install-all' failed
make: *** [do-install-all] Error 1

这似乎与 ruby​​gems 中的某些内容有关。

有趣的是,我尝试自己构建 ruby​​ 的原因是,Synology 6 提供的 ruby​​ 版本在我尝试安装 gems 时返回了类似的错误:

florian@synology:~/.rbenv/plugins$ /usr/bin/gem install rails
ERROR:  Loading command: install (LoadError)
        /usr/lib/ruby/2.3.0/armle-linux-gnu/openssl.so: undefined symbol: SSLv2_method - /usr/lib/ruby/2.3.0/armle-linux-gnu/openssl.so
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass

什么可能导致这些问题,我该如何解决?

【问题讨论】:

  • 您是否尝试过其他与您的帖子相匹配的建议,例如This OneThis One,似乎他们都建议在使用rvm 安装时明确设置open-ssl-dir,例如@987654325 @
  • 我没有使用 RVM,您强调的解决方案似乎使用了一些由 RVM 提供的 openssl 库。不幸的是,如果我尝试安装 RVM 会失败(由于缺少 getent 和其他错误)。我现在尝试运行RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt/local rbenv install 2.2.4,看看这是否有任何改变。
  • 使用RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt/local 没有帮助。我预计问题出在其他地方。
  • 这是尝试使用https 的问题,一个简单的解决方法是将您的gem 源更改为http://rubygems.org,但这只是绕过问题并没有真正解决它。
  • 按照 github.com/rbenv/ruby-build/issues/1011 brew unlink openssl 为我工作

标签: ruby openssl rbenv


【解决方案1】:

当我在这两种情况下运行 rbenv install 2.2.4 或 rbenv install 2.3.0 时,构建失败并显示错误消息"undefined symbol: SSLv2_method"...

什么可能导致这些问题...

由于CVE-2016-0800 (DROWN Attack),SSLv2 设备已于 3 月从 OpenSSL 中完全移除。

我认为由于您正在经历的影响,完全删除有点苛刻。应该有一个警告和过渡期。它应该发生在 10 年前左右。

我认为SSLv2_methodSSLv2_client_methodSSLv2_server_method 应该设置一个适当的错误代码,如ERR_R_REMOVED_INSECURE 并返回NULL,而不是由于DROWN 完全删除。 &lt;openssl/opensslconf.h&gt; 也应该无条件设置OPENSSL_NO_SSL2

OpenSSL 意识到他们破坏了 ABI 兼容性,并使用Commit 133138569f37d149 将符号添加回 1.0.2。签入再次提供了符号SSLv2_methodSSLv2_client_methodSSLv2_server_method,但它们返回NULL 而没有设置错误代码。他们也没有定义OPENSSL_NO_SSL2。另见[openssl.org #4398] BUG / 1.0.2g breaks CURL extension

SSLv2 不安全已有 15 年或 20 年了。像 Ruby 这样的包不应该引用这些符号。您应该针对 Ruby 提交安全错误报告以引用该符号。


...我该如何解决它们?

要解决此问题,我认为您需要 (1) 等待 OpenSSL 1.0.2h,(2),手动修补 OpenSSL 1.0.2g,或 (3) 删除对 SSLv2_methodSSLv2_client_method 的所有 Ruby 引用和SSLv2_server_method

这里是你需要的补丁(2),手动打补丁 OpenSSL 1.0.2g:

diff --git a/ssl/s2_meth.c b/ssl/s2_meth.c
index b312f17..d46e2f5 100644
--- a/ssl/s2_meth.c
+++ b/ssl/s2_meth.c
@@ -74,8 +74,8 @@ IMPLEMENT_ssl2_meth_func(SSLv2_method,
                          ssl2_accept, ssl2_connect, ssl2_get_method)
 #else                           /* !OPENSSL_NO_SSL2 */

-# if PEDANTIC
-static void *dummy = &dummy;
-# endif
+SSL_METHOD *SSLv2_method(void) { return NULL; }
+SSL_METHOD *SSLv2_client_method(void) { return NULL; }
+SSL_METHOD *SSLv2_server_method(void) { return NULL; }

 #endif 

您还应该使用至少no-ssl2 no-ssl3 no-comp 标志配置和编译 OpenSSL,因为它们是已知的安全问题。配置选项在&lt;openssl/opensslconf.h&gt; 中定义OPENSSL_NO_SSL2OPENSSL_NO_SSL3OPENSSL_NO_COMP

【讨论】:

  • 感谢非常详细的回答!由于它现在有效,我将把它留在这里。我将使用 openssl 1.0.2h 再次重试,希望它尽快发布。
【解决方案2】:

经过多次尝试和大量搜索,我找到了这个ruby-build issue 并重新阅读了ruby-build wiki 中的说明,这些说明建议其他平台安装autoconf。我使用 ipkg 安装了 automaker、autoconf 和 gdbm(我在 ruby​​-build 日志中发现了一些警告),但这并没有直接帮助。只有在我为 rbenv 加上 RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt 前缀后它才起作用。

作为参考,这些是我用 ipkg 安装的包

autoconf - 2.69-1
automake - 1.15-3
binutils - 2.25.1-1
gcc - 5.3.0-6
gconv-modules - 2.21-3
gdbm - 1.8.3-4
glibc-opt - 2.21-4
libc-dev - 2.21-1
libgmp - 6.0.0a-1
libmpc - 1.0.2-1
libmpfr - 3.1.3-1
libnsl - 2.21-3
libstdc++ - 6.0.21-6
m4 - 1.4.17-1
make - 4.1-1
ncurses - 5.7-4
openssl - 1.0.2f-1
openssl-dev - 1.0.2f-1
readline - 6.1-2
ruby - 2.2.0-1
screen - 4.2.1-2
termcap - 1.3.1-3
zlib - 1.2.8-2

这是最终对我有用的 rbenv 命令

RUBY_CONFIGURE_OPTS=--with-openssl-dir=/opt rbenv install 2.3.0 -v

【讨论】:

    猜你喜欢
    • 2018-07-23
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    相关资源
    最近更新 更多