Ответ 1
Ruby не может найти корневые сертификаты. Ниже приведен вариант для отладки. Поместите следующий код в начале вашего script:
require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
Я пытаюсь аутентифицировать пользователей 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
Ruby не может найти корневые сертификаты. Ниже приведен вариант для отладки. Поместите следующий код в начале вашего script:
require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
Добавьте следующий код в 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
У меня возникла такая же проблема после обновления 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
Надеюсь, что это поможет
Похоже, что проверка 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'
на путь к вашему набору. Если вам это нужно, я верю, что этот файл будет работать для вас - просто поместите его куда-нибудь, дайте ему необходимые разрешения и укажите свое приложение на он.
Спасибо Алексу Кремеру за этот ответ "Ответ" за подробные инструкции.
Эта ссылка должна работать. https://gist.github.com/fnichol/867550 Просто следуйте инструкциям. Вам нужно будет загрузить Rails installer и запустить две функции командной строки.
Ужасный обходной путь, который я только что сделал, - переопределить класс в 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, или это будет лучший маршрут.
Сделайте это, это приведет к ошибке сертификата с помощью openssl
sudo curl http://curl.haxx.se/ca/cacert.pem -o /opt/local/etc/openssl/cert.pem