2015-09-25 2 views
4

У меня есть серверное приложение Rails, которое использует драгоценный камень openid_connect. При попытке запустить его на CentOS 6.6, я получаю:«Неинициализированная константа OpenSSL :: PKey :: EC» от ​​Ruby on 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>' 

Что это значит и как я могу пройти мимо него?

ответ

3

Эта проблема связана с отказом Red Hat отказаться от определенных алгоритмов Elliptic Curve (EC) в стандартном сборке OpenOSL в CentOS по умолчанию (по причинам страха перед патентом).

Примечание: согласно @Cal's answer, CentOS 6.7 не имеет этой проблемы.

Драгоценный камень openid_connect зависит от драгоценного камня json-jwt, в котором используется один из тех алгоритмов, которые не включены.

Поэтому вам необходимо перестроить новую версию OpenSSL, которая включает в себя необходимые алгоритмы.

Эти шаги я следовал (адаптировано из here), чтобы построить новый OpenSSL на моей машине:

  1. cd /usr/src
  2. wget https://www.openssl.org/source/openssl-1.0.1l.tar.gz
  3. yum install autoconf automake (вы, наверное, уже это установлено)
  4. tar zxvf openssl-1.0.1l.tar.gz
  5. cd openssl-1.0.1l
  6. export CFLAGS="-fPIC"
  7. ./config --prefix=/opt/openssl shared enable-ec enable-ecdh enable-ecdsa
  8. make all
  9. make install

Теперь ваш рубин, вероятно, все еще связаны со старой библиотеки OpenSSL, так что вам нужно, чтобы восстановить его, чтобы связать с новым.

Вы используете rvm? Тогда здорово! Любые новые Rubies, которые вы установили, будут построены против нового OpenSSL. rvm remove ваш Ruby и переустановите его (или просто установите другую версию ruby).

Не используется rvm? Тогда, я думаю, вам нужно будет перестроить Ruby традиционным способом. Но вы, наверное, уже знаете, как это сделать, не так ли? Если нет, вам нужно будет посмотреть в другом учебнике, потому что мы не можем это покрыть.

Теперь переустановите bunder и выполните bundle install, и ваш rails server должен теперь успешно работать.

(Если у кого-либо есть исправления или пояснения, пожалуйста, оставьте комментарий, и я внесу необходимые изменения.)

1

Я столкнулся с этой же проблемой с CentOS 6.6. Но я не хотел перекомпилировать пользовательский openssl и ruby, чтобы исправить это. Я не делал очень хороших заметок, потому что я пробовал так много всего, но похоже, что обновление для всех последних & пакетов в CentOS 6.7 решает проблему.

Вот несколько соответствующих версий пакета у меня есть:

openssl098e-0.9.8e-18.el6_5.2.x86_64                
openssl-1.0.1e-42.el6.x86_64                 
openssl-1.0.1e-42.el6.i686 
openssl-devel-1.0.1e-42.el6.x86_64 
glibc-2.12-1.166.el6_7.3.x86_64 
kernel-2.6.32-573.7.1.el6.x86_64 

После обновления этих пакетов, перезагрузки и переустановки мой скрепляйте JSON-JWT камень работал отлично.

Это были наши производственные машины, и я считаю, что стандартные библиотеки ruby ​​были скомпилированы из источника, а затем созданы как пользовательский RPM.

Наш сервер сборки использует RVM, и это в конечном итоге стало больно. Установщик RVM продолжал вытаскивать двоичные файлы для centos, и тот же отказ возвращался снова.

Found remote file https://rvm.io/binaries/centos/6/x86_64/ruby-1.9.3-p484.tar.bz2 

Я заставил источник перекомпиляцию так:

rvm reinstall --disable-binary ruby-1.9.3-p484 

И я заметил, что очень замечательное ищут сообщение:

#applying patch .rvm/patches/ruby/ssl_no_ec2m.patch. 

Этот файл патч имеют некоторые условия C макросы, которые появляются, чтобы исключить некоторый код, связанный с ЕС.

И это сработало! Я также заметил, что в рубине openssl.so есть много связанных с ЕС символов. Ранее упаковываются CentOS рубин сделал не у них:

$ cd ~/.rvm/rubies/ruby-1.9.3-p484/lib/ruby/1.9.1/x86_64-linux 
$ strings openssl.so |grep _EC 
PEM_write_bio_ECPKParameters 
i2d_ECPKParameters 
PEM_read_bio_ECPKParameters 
d2i_ECPKParameters 
PEM_write_bio_ECPrivateKey 
i2d_ECPrivateKey_bio 
i2d_EC_PUBKEY_bio 
PEM_write_bio_EC_PUBKEY 
PEM_read_bio_ECPrivateKey 
PEM_read_bio_EC_PUBKEY 
d2i_ECPrivateKey_bio 
d2i_EC_PUBKEY_bio 
OPENSSL_1.0.1_EC 
EVP_PKEY_assign_EC_KEY 
OP_SINGLE_ECDH_USE 

Если бы я должен был догадаться, о перекомпиляции против моего нового OpenSSL 1.0.1 пакета должен вызвали некоторые C макросы, которые открылись каким-то альтернативный алгоритм, который не имеет юридической защиты.

Если вы отметили свой символ openssl.so для символов, и у него нет всех связанных с этим элементов, это, вероятно, проблема.

+0

Полезно знать. Я использовал 6.6. Я обновлю свой вопрос/ответ, чтобы отметить версию. –

Смежные вопросы