我有一个使用openid_connect
gem的Rails服务器应用程序。当我尝试在CentOS 6.6上运行它时,我得到:
uninitialized constant OpenSSL::PKey::EC
下面是完整的stacktrace:
$ rails server
/home/foo/.rvm/gems/ruby-2.1.3/gems/json-jwt-1.5.1/lib/json/jwk/jwkizable.rb:69:in `<top (required)>': uninitialized constant OpenSSL::PKey::EC (NameError)
from /home/foo/.rvm/gems/ruby-2.1.3/gems/json-jwt-1.5.1/lib/json/jwt.rb:102:in `<top (required)>'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/openid_connect-0.9.2/lib/openid_connect/response_object/id_token.rb:1:in `<top (required)>'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/openid_connect-0.9.2/lib/openid_connect/response_object.rb:7:in `block in <top (required)>'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/openid_connect-0.9.2/lib/openid_connect/response_object.rb:6:in `each'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/openid_connect-0.9.2/lib/openid_connect/response_object.rb:6:in `<top (required)>'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/openid_connect-0.9.2/lib/openid_connect/connect_object.rb:52:in `<top (required)>'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/openid_connect-0.9.2/lib/openid_connect.rb:85:in `<top (required)>'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/bundler-1.10.6/lib/bundler/runtime.rb:76:in `require'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/bundler-1.10.6/lib/bundler/runtime.rb:76:in `block (2 levels) in require'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/bundler-1.10.6/lib/bundler/runtime.rb:72:in `each'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/bundler-1.10.6/lib/bundler/runtime.rb:72:in `block in require'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/bundler-1.10.6/lib/bundler/runtime.rb:61:in `each'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/bundler-1.10.6/lib/bundler/runtime.rb:61:in `require'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/bundler-1.10.6/lib/bundler.rb:134:in `require'
from /home/foo/tmp/openid_connect_sample/config/application.rb:7:in `<top (required)>'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/railties-3.2.22/lib/rails/commands.rb:53:in `require'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/railties-3.2.22/lib/rails/commands.rb:53:in `block in <top (required)>'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/railties-3.2.22/lib/rails/commands.rb:50:in `tap'
from /home/foo/.rvm/gems/ruby-2.1.3/gems/railties-3.2.22/lib/rails/commands.rb:50:in `<top (required)>'
from script/rails:6:in `require'
from script/rails:6:in `<main>'
这是什么意思,我如何才能克服它?
2条答案
按热度按时间dtcbnfnu1#
这个问题源于Red Hat拒绝在CentOS的OpenSSL默认构建中包含某些椭圆曲线(EC)算法(出于担心专利诉讼的原因)。
注意:根据@Cal的回答,CentOS 6.7没有这个问题。
openid_connect
gem依赖于json-jwt
gem,后者使用一种未包含的算法。因此,您需要重新构建一个包含所需算法的OpenSSL新版本。
以下是我在我的机器上构建新OpenSSL所遵循的步骤(改编自here):
cd /usr/src
wget https://www.openssl.org/source/openssl-1.0.1l.tar.gz
yum install autoconf automake
(您可能已经安装了这些)tar zxvf openssl-1.0.1l.tar.gz
cd openssl-1.0.1l
export CFLAGS="-fPIC"
./config --prefix=/opt/openssl shared enable-ec enable-ecdh enable-ecdsa
make all
make install
现在,您的Ruby可能仍然链接到旧的OpenSSL库,因此您需要重新构建它以链接到新库。
**您是否正在使用
rvm
?那就太好了!您安装的任何新Rubies都将针对新的OpenSSL进行构建。rvm remove
你的Ruby并重新安装它(或者简单地安装一个不同的Ruby版本)。**不使用
rvm
?**然后我想你需要用传统的方式重建Ruby。但你可能已经知道怎么做了,对吧?如果没有,您需要查看不同的教程,因为我们无法在这里介绍。现在重新安装
bunder
并执行bundle install
,您的rails server
现在应该可以成功运行。(If任何人都有更正或澄清提供,请留下评论,我会作出必要的编辑。
oknwwptz2#
我在CentOS 6.6中遇到了同样的问题。但我不想重新编译一个自定义的openssl和ruby来解决这个问题。我没有做很好的笔记,因为我尝试了太多的东西,但似乎更新到所有最新和最伟大的软件包到CentOS 6.7解决了这个问题。
以下是我拥有的几个相关软件包版本:
在更新了这些包,重新启动并重新安装我的bundle之后,json-jwt gem工作得很好。
这是我们的生产机器,我相信ruby标准库是从源代码编译的,然后作为自定义RPM创建的。
我们的构建服务器使用RVM,这最终变得更加痛苦。RVM安装程序一直在为centos提取二进制文件,同样的故障再次出现。
我强制源代码重新编译如下:
我注意到了一条很棒的信息:
该补丁文件有一些C宏条件,似乎排除了一些EC相关的代码。
而且成功了!我还注意到ruby的openssl.so中有很多与EC相关的符号。以前打包的centos ruby没有 * 这些:
如果我不得不猜测,对我的新openssl 1.0.1包的重新编译一定触发了一些C宏,这些宏打开了某种不受法律保护的替代算法。
如果你检查你的openssl.so的符号,它没有所有这些_EC相关的东西,这可能是一个问题。