OpenSSL::SSL::SSLError в Heroku

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

Итак, я получаю эту ошибку в моем приложении 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

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

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

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

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

2 ответа

Решение

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

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

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

Эта ошибка вызвана тем, что Ruby не может найти сертификаты центра сертификации (CA Certs), используемые для проверки подлинности защищенных веб-серверов. Решение состоит в том, чтобы загрузить этот 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

ОБНОВИТЬ:

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

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

Вы можете проверить это на своих серверах 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-сертификаты.crt

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

Другие вопросы по тегам