Как избавиться от OpenSSL :: SSL :: SSLError - PullRequest
31 голосов
/ 19 апреля 2011

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

OpenSSL :: SSL :: SSLError Возвращено SSL_connect = 1 errno = 0 состояние = чтение SSLv3сертификат сервера B: сбой проверки сертификата

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

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

Ответы [ 7 ]

20 голосов
/ 20 августа 2012

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

   require 'openssl'
   OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
8 голосов
/ 01 августа 2012

Добавьте следующий код в 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
7 голосов
/ 18 марта 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 ​​на вашем локальном компьютере, например: rvm install 2.2.0 --disable-binary

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

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

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

6 голосов
/ 21 апреля 2011

Похоже, проверка 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' на путь к вашему пакету.Если вам он нужен, я думаю, этот файл будет работать для вас - просто поместите его куда-нибудь, дайте ему необходимые разрешения и укажите в нем свое приложение.1011 * этот SO ответ для подробных инструкций.

1 голос
/ 11 марта 2014

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

0 голосов
/ 12 октября 2011

Сделайте это, вы получите ошибку сертификата с openssl

sudo curl http://curl.haxx.se/ca/cacert.pem -o /opt/local/etc/openssl/cert.pem
0 голосов
/ 30 июня 2011

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

    require 'net/http'
    require 'openssl'

    class Net::HTTP   alias_method :origConnect, :connect
        def connect
          @ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
          origConnect
        end
    end

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

...