您的系统上可以安装多个版本的 OpenSSL。这两个测试告诉您如果要进行构建,哪个版本将链接到您的 Ruby,以及您当前使用的 Ruby 中实际链接的版本。
例如,假设您仍在使用 Ruby 1.9.3,并在去年安装/编译了它。它会与您当时安装的 OpenSSL 版本相关联。与此同时,您更新了 OpenSSL 版本(例如,使用Homebrew),以响应 Heartbleed 问题。
如果您运行第一个测试,您将返回 OpenSSL 1.0.1g,即您刚刚升级的链接的当前版本。
如果您运行第二个测试,它将显示您的 Ruby 副本可能仍链接到较旧的、易受攻击的 OpenSSL 副本。
例如,我将使用我自己的系统(Mac OSX 10.9)的输出:
系统 Ruby (2.0.0) 上的结果:
[~] $ ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil ["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)'`
ruby 2.0.0p247 (2013-06-27 revision 41674) [universal.x86_64-darwin13]
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/openssl/ssl.rb:10 1: warning: assigned but unused variable - id
OpenSSL 0.9.8y 5 Feb 2013
[~] $ ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
OpenSSL 0.9.8y 5 Feb 2013
Ruby 2.1.1p76 上的结果(由 rbenv 管理,但可能是 RVM 或其他):
[~] $ ruby -v -ropenssl -rfiddle -e 'puts Fiddle::Function.new(Fiddle.dlopen(nil)["SSLeay_version"], [Fiddle::TYPE_INT], Fiddle::TYPE_VOIDP).call(0)'
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]
OpenSSL 1.0.1g 7 Apr 2014
[~] $ ruby -ropenssl -e 'puts OpenSSL::OPENSSL_VERSION'
OpenSSL 1.0.1g 7 Apr 2014
如您所见,系统 rubyOpenSSL
与 OS X 附带的相关联,尚未由 Apple 修补。Ruby 2.1.1 我在使用Homebrew
升级我安装的OpenSSL
.
[~] $ brew list openssl
/usr/local/Cellar/openssl/1.0.1g/bin/openssl
/usr/local/Cellar/openssl/1.0.1g/bin/c_rehash
/usr/local/Cellar/openssl/1.0.1g/include/openssl/ (75 files)
/usr/local/Cellar/openssl/1.0.1g/lib/libcrypto.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.1g/lib/libssl.1.0.0.dylib
/usr/local/Cellar/openssl/1.0.1g/lib/engines/ (12 files)
/usr/local/Cellar/openssl/1.0.1g/lib/pkgconfig/ (3 files)
/usr/local/Cellar/openssl/1.0.1g/lib/ (4 other files)
/usr/local/Cellar/openssl/1.0.1g/share/man/ (1126 files)
首先确保您拥有最新的 OpenSSL,如果您使用的是Homebrew,只需使用:
brew upgrade openssl
.
此外,请确保删除旧版本的 OpenSSLbrew cleanup openssl
我不建议修补系统 Ruby,最好使用 Ruby 版本管理器,例如rbenv或RVM。更新 SSL 后,按照版本管理器的正常构建/安装说明删除并重新构建您使用的 Ruby 版本。