Как избавиться от OpenSSL::SSL::SSLError

Я пытаюсь аутентифицировать пользователей в Facebook с помощью OmniAuth. Сначала он работал, но в процессе работы он просто перестал работать и начал выдавать мне это сообщение об ошибке:

OpenSSL::SSL::SSLError SSL_connect return=1 errno=0 state=SSLv3 чтение сертификата сервера B: проверка сертификата не удалась

Тот же код хорошо работает для Twitter, и я не могу понять, почему он не работает для Facebook. Я искал онлайн для помощи, но я не был успешным.

Это ссылка на веб-сайт, который я создаю: http://www.bestizz.com/
И этот URL даст вам сообщение об ошибке: http://www.bestizz.com/auth/facebook


person Eugene    schedule 19.04.2011    source источник
comment
Мы не можем сказать вам, какой код изменить, если вы не покажете нам код, который у вас уже есть. :) Возможно, это поможет?   -  person Michelle Tilley    schedule 19.04.2011
comment
Извините, это ссылка на мой код и описание проблемы ссылка @ БрэндонТилли   -  person Eugene    schedule 20.04.2011
comment
вы получаете трассировку стека? В стеке есть несколько библиотек (OmniAuth, OAuth2, Faraday и т. д.), и если у вас есть трассировка стека, это, вероятно, очень поможет.   -  person Michelle Tilley    schedule 20.04.2011
comment
@brandonTilley, извините, что хожу по кругу. Кстати, впервые на этом форуме, это ссылка на мою трассировку стека фреймворка. ссылка   -  person Eugene    schedule 21.04.2011
comment
Нет проблем ^_^ Наконец-то добавил ответ :) Удачи   -  person Michelle Tilley    schedule 21.04.2011


Ответы (7)


Ruby не может найти корневые сертификаты. Вот вариант для отладки. Поместите следующий код в начало вашего скрипта:

   require 'openssl'
   OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
person RAJ    schedule 20.08.2012
comment
Это не следует рассматривать как вариант. Исправьте это должным образом или даже не беспокойтесь об использовании SSL. - person Joshua Pinter; 27.07.2014
comment
Как уже отмечалось, это ТОЛЬКО для отладки или разработки. НЕ используйте этот код в производстве. - person eltiare; 09.04.2015
comment
Действительно, для отладки, когда я общаюсь с серверами, на которых я не установил сертификаты, я делаю это. На моем Ruby я получаю ошибку присваивания динамической константы, поэтому вместо этого я исправил ее, так что что-то вроде module OpenSSL; module SSL; VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE; end; end - person sameers; 22.07.2015
comment
Я определенно думаю, что в своем ответе вы должны указать, почему это очень небезопасно. - person thesecretmaster; 09.08.2015
comment
Мало того, что это нарушение безопасности, это даже бесполезно до такой степени, что не говорит, ГДЕ поместить этот код. - person igraczech; 07.03.2016
comment
Код должен идти в самом начале скрипта. - person SophiaAP; 27.09.2016

Добавьте следующий код в config/initializers/fix_ssl.rb

require 'open-uri'
require 'net/https'

module Net
  class HTTP
    alias_method :original_use_ssl=, :use_ssl=

    def use_ssl=(flag)
      self.ca_file = "/etc/pki/tls/certs/ca-bundle.crt"  # for Centos/Redhat
      self.verify_mode = OpenSSL::SSL::VERIFY_PEER
      self.original_use_ssl = flag
    end
  end
end

Примечание:

Многие операционные системы уже поставляются с поставляемым пакетом сертификатов. Например, в Red Hat Enterprise Linux и CentOS он установлен в:

/etc/pki/tls/certs/ca-bundle.crt

Для Ubuntu это по адресу:

/etc/ssl/certs/ca-certificates.crt
person Amal Kumar S    schedule 01.08.2012
comment
Я не могу найти каталог инициализаторов в моем каталоге .config (я на Ubuntu), не могли бы вы мне помочь? - person lakesare; 19.07.2014
comment
config/initializers находится в структуре папок вашего приложения Rails. Это решение предназначено для приложения Rails. - person Amal Kumar S; 21.07.2014
comment
Для меня было достаточно установить переменную окружения в redhat export SSL_CERT_FILE='/etc/pki/tls/certs/ca-bundle.crt' - person Cherry; 10.12.2014
comment
строка self.ca_file = "/etc/pki/tls/certs/ca-bundle.crt помогла мне с моим консольным приложением ruby. Ни одно другое решение не сработало. Я думаю, ssls не мог знать, какой файл сертификата использовать. - person Zeeshan; 22.07.2016

Я столкнулся с той же проблемой после обновления Ruby, работающего на Yosemite, но при попытке пройти аутентификацию в Google.

После этого: https://toadle.me/2015/04/16/fixing-failing-ssl-verification-with-rvm.html, похоже, решил мою проблему.

Ради истории процитирую:

Таким образом, установленный rvm ruby ​​ищет сертификаты в неправильном каталоге, тогда как OSX-ruby будет искать правильный. В данном случае это системный каталог OSX.

Таким образом, установленный rvm ruby ​​​​является проблемой.

Это обсуждение на Github наконец дало решение: каким-то образом RVM поставляется с предварительно скомпилированной версией ruby, которая статически связана с openssl, который просматривает /etc/openssl для своих сертификатов.

То, что вы хотите сделать, это НЕ ИСПОЛЬЗОВАТЬ какие-либо предварительно скомпилированные ruby, а лучше скомпилировать ruby ​​​​на вашем локальном компьютере, например: rvm install 2.2.0 --disable-binary

В конце концов мне пришлось запустить:

rvm uninstall ruby-2.2.4
rvm install ruby-2.2.4 --disable-binary
gem pristine --all

Надеюсь это поможет

person rpbaltazar    schedule 18.03.2016

Похоже, проверка SSL не работает для Facebook. Я не мастер OpenSSL, но я думаю, что это должно сработать для вас.

Предполагая, что вы используете актуальную версию OmniAuth (>= 0.2.2, я предполагаю, что вы используете) и версию Faraday> = 0.6.1 (трассировка стека говорит, что вы), вы можете передать местоположение вашего пакета сертификатов ЦС. Измените настройки OmniAuth для Facebook соответствующим образом:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, 'appid', 'appsecret', {:scope => 'publish_stream,email', :client_options => {:ssl => {:ca_path => '/etc/ssl/certs'}}}
  # other providers...
end

и замените '/etc/ssl/certs' на путь к вашему пакету. Если он вам нужен, я считаю, что этот файл подойдет вам — просто поместите его где-нибудь, дайте ему необходимые разрешения и укажите на него свое приложение.

Спасибо Алексу Кремеру за этот ответ SO за подробные инструкции.

person Michelle Tilley    schedule 21.04.2011
comment
да... @brandon... работает отлично. Большое спасибо. Похоже, у меня возникла эта проблема после того, как я обновил свои драгоценные камни ... Это проблема с Omniauth 0.2.1 - 0.2.2. - person Eugene; 22.04.2011

Эта ссылка должна работать. https://gist.github.com/fnichol/867550 Просто следуйте инструкциям. Вам нужно будет загрузить установщик Rails и запустить две функции командной строки.

person IEnjoyEatingVegetables    schedule 11.03.2014

Сделайте это, это избавит вас от ошибки сертификата с openssl

sudo curl http://curl.haxx.se/ca/cacert.pem -o /opt/local/etc/openssl/cert.pem
person Raymond Gao    schedule 12.10.2011
comment
Похоже, это для самостоятельной установки, может быть, MacPorts OpenSSL? любая идея для стандартной Mac OS X или доморощенного? - person Ivan; 06.08.2012
comment
Это сработало для меня с RVM на Mountain Lion: curl http://curl.haxx.se/ca/cacert.pem -o ~/.rvm/usr/ssl/cert.pem - person Lachlan Cotter; 14.09.2012
comment
@Lachlan Cotter, большое спасибо! Благодаря этой команде мне наконец удалось заставить приложения RailsApps Project работать с Rails 3.2.8 на Mountain Lion. - person Paul Fioravanti; 18.10.2012

Уродливый обходной путь, который я только что сделал, состоит в том, чтобы переопределить класс в Net::HTTP и установить переменную, которая говорит ему не проверять сертификаты ssl:

    require 'net/http'
    require 'openssl'

    class Net::HTTP   
        alias_method :orig_connect, :connect

        def connect
          @ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
          orig_connect
        end
    end

Я сделал это так, потому что не хочу возиться с исходным кодом гема, который вызывает гем, который вызывает гем, который вызывает Net::HTTP. Я действительно должен вернуться и выяснить, как подтолкнуть его к просмотру отдельного файла cacert.pem. Я не могу изменить серверный файл cacert.pem, иначе это был бы лучший маршрут.

person JBB    schedule 30.06.2011
comment
Нет необходимости открывать класс и переопределять метод — вы можете изменить verify_mode непосредственно в создаваемом вами HTTP-объекте: http.verify_mode = OpenSSL::SSL::VERIFY_NONE - person Mike A.; 21.10.2011
comment
@МайкА. это работает, только если вы создаете экземпляр Net::HTTP. - person Kelvin; 20.08.2013
comment
—1 для OpenSSL::SSL::VERIFY_NONE. - person jww; 13.04.2015