OpenSSL:: SSL:: SSLError на Heroku

Я пытаюсь аутентифицировать пользователя через Facebook или Twitter, заставлять их заполнять свою информацию, а затем нажать "Сохранить" (таким образом создав запись пользователя). Я получаю ошибку OpenSSL на этом последнем шаге - после нажатия save. Это происходит при создании метода создания объявлений RegentationsController #.

Итак, я получаю эту ошибку в моем приложении Rails, размещенном на Heroku:

2012-07-28T18:25:13+00:00 app[web.1]: OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed)

Я видел множество решений, ни одна из них не работает. Вот несколько вещей, которые я пробовал:

1) Установка драгоценного камня certified

2) Модернизация драгоценного камня Heroku до v2.30, повторное нажатие

3) Это:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, TWITTER_KEY, TWITTER_SECRET, {:client_options => {:ssl => {:ca_file => "/usr/lib/ssl/certs/ca-certificates.crt"}}}
  provider :facebook, FACEBOOK_KEY, FACEBOOK_SECRET, {:scope => "publish_actions,user_location,email", :client_options => {:ssl => {:ca_file => "/usr/lib/ssl/certs/ca-certificates.crt"}}}
end

Кажется, что одна проблема может заключаться в том, что этот файл cert фактически не существует - я видел его в нескольких местах, и похоже, что это путь по умолчанию к файлу ca_cert для Heroku, но я мог бы быть неправильно.

Как ни странно, это происходит после Я уже прошел аутентификацию через FB/Twitter и пытаюсь создать учетную запись пользователя. Почему это так, и как я могу решить/отладить это? Искренне смущен.

Обновление: Я добавил эту строку в инициализатор Omniauth, и теперь он "работает". Таким образом, я поставил диагноз проблемы с Omniauth. Тем не менее, я бы хотел, чтобы все еще была проверка SSL... это явно оставляет разрыв в безопасности.

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

Ответ 1

После некоторого поиска вот что я нашел:

Если вы используете Ruby для открытия соединений с внешним сервером по https, например. API-интерфейс Facebook, вы можете столкнуться с следующей ошибкой:

OpenSSL::SSL::SSLError:SSL_connectreturned=1errno=0state=SSLv3readservercertificateB:certificateverifyfailed

Эта ошибка объясняется тем, что Ruby не смог найти сертификаты центра сертификации (сертификаты CA), используемые для проверки подлинности защищенных веб-серверов. Решение заключается в загрузке этого ca-bundle.crt в каталог приложений lib/: Затем добавьте следующий код в 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 = Rails.root.join('lib/ca-bundle.crt').to_s
      self.verify_mode = OpenSSL::SSL::VERIFY_PEER
      self.original_use_ssl = flag
    end
  end
end

Это должно заставить ruby ​​использовать пакет CA из каталога приложений lib/.

Взято из: http://jimneath.org/2011/10/19/ruby-ssl-certificate-verify-failed.html

UPDATE:

Возможно, вам понадобится self.ca_path= вместо self.ca_file= в зависимости от вашей системы.

Ответ 2

Похоже, у вас есть правильная конфигурация openssl в OmniAuth, но, возможно, ваш CA certs path неправилен?

Вы можете проверить это на серверах heroku, выполнив:

heroku run bash

... и затем запустите openssl, чтобы отобразить правильный путь:

$ openssl version -a
OpenSSL 1.0.0e 6 Sep 2011
OPENSSLDIR: "/usr/lib/ssl"

... Вы должны найти файл ca_certificates.crt в $OPENSSLDIR/certs/ca-certificates.crt

Я бы подтвердил, что путь обновляет ваш код, чтобы он соответствовал.