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
Я бы подтвердил, что путь обновления вашего кода для соответствия.