Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

   require 'openssl'
   OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

Ответ 2

Добавьте следующий код в 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

Ответ 3

У меня возникла такая же проблема после обновления Ruby на Yosemite, но при попытке аутентификации с Google.

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

Во имя истории я приведу:

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

Итак, проблема с rvm-установленным рубином.

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

Что вы хотите сделать, это НЕ ИСПОЛЬЗОВАТЬ любой из предварительно скомбинированных рубинов и, скорее, скомпилировать 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

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

Ответ 4

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

Предполагая, что вы используете обновленную версию OmniAuth ( >= 0.2.2, я полагаю, что вы есть) и версию Faraday >= 0.6.1 (трассировка стека говорит, что вы есть), вы можете укажите местоположение пакета сертификатов CA. Измените настройку 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' на путь к вашему набору. Если вам это нужно, я верю, что этот файл будет работать для вас - просто поместите его куда-нибудь, дайте ему необходимые разрешения и укажите свое приложение на он.

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

Ответ 5

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

Ответ 6

Ужасный обходной путь, который я только что сделал, - переопределить класс в 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, или это будет лучший маршрут.

Ответ 7

Сделайте это, это приведет к ошибке сертификата с помощью openssl

sudo curl http://curl.haxx.se/ca/cacert.pem -o /opt/local/etc/openssl/cert.pem