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

257

Я использую Authlogic-Connect для сторонних пользователей. После того, как вы выполнили соответствующие миграции, лог-серверы Twitter/Google/yahoo, похоже, работают нормально, но вход в facebook исключает:

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

В журнале dev отображается

OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed):
  app/controllers/users_controller.rb:37:in `update'

Пожалуйста, предложите..

Теги:
ssl
facebook-graph-api
authlogic

36 ответов

127

У меня возникла аналогичная проблема при попытке использовать генератор JQuery для Rails 3

Я решил это так:

  • Получить пакет CURL Certificate Authority (CA). Вы можете сделать это с помощью

    • sudo port install curl-ca-bundle [если вы используете MacPorts]
    • или просто потяните его прямо wget http://curl.haxx.se/ca/cacert.pem
  • Выполните код ruby, который пытается проверить сертификацию SSL: SSL_CERT_FILE=/opt/local/etc/certs/cacert.pem rails generate jquery:install. В вашем случае вы хотите либо установить это как переменную окружения где-нибудь сервер подбирает ее, либо добавить что-то вроде ENV['SSL_CERT_FILE'] = /path/to/your/new/cacert.pem в файл environment.rb.

Вы также можете просто установить файлы CA (я не пробовал это) в ОС - есть длительные инструкции здесь - это должно работать в аналогичная мода, но я не пробовал это лично.

В основном, проблема, с которой вы сталкиваетесь, заключается в том, что некоторые веб-службы отвечают сертификатом, подписанным против ЦС, который OpenSSL не может проверить.

  • 1
    Это работало и для меня, когда я пытался подключиться к моей учетной записи Gmail, используя Ruby Net :: IMAP из сценария ruby. Спасибо.
  • 4
    Да, это прекрасно работает на ruby-1.9.3. Я добавил это в мой конфиг bash. export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cert.pem
Показать ещё 9 комментариев
124

Если вы используете RVM для OS X, вам, вероятно, нужно запустить это:

rvm osx-ssl-certs update all

Дополнительная информация здесь: http://rvm.io/support/fixing-broken-ssl-certificates

И вот полное объяснение: https://github.com/wayneeseguin/rvm/blob/master/help/osx-ssl-certs.md


Update

В Ruby 2.2 вам, возможно, придется переустановить Ruby из источника, чтобы исправить это. Вот как (замените 2.2.3 на вашу версию Ruby):

rvm reinstall 2.2.3 --disable-binary

Кредит https://stackoverflow.com/questions/32353917/cant-run-ruby-2-2-3-with-rvm-on-osx и Ян Коннор.

  • 2
    Вот гораздо более полная рецензия с альтернативами: railsapps.github.io/openssl-certificate-verify-failed.html
  • 0
    ОШИБКА: обновление rvm было удалено. Вместо этого смотрите CLI API 'rvm get' и rvm 'rubygems'
Показать ещё 8 комментариев
119

Здесь вы можете исправить это в Windows: https://gist.github.com/867550 (созданный Fletcher Nichol)

Выдержки:

Ручной режим (расточка)

Загрузите файл cacert.pem из http://curl.haxx.se/ca/cacert.pem. Сохраните этот файл в C:\RailsInstaller\cacert.pem.

Теперь сообщите рубину о своем комплекте сертификатов, установив SSL_CERT_FILE. Чтобы установить это в текущем сеансе командной строки, введите:

set SSL_CERT_FILE=C:\RailsInstaller\cacert.pem

Чтобы сделать это постоянным, добавьте его в панель управления .

  • 6
    Спасибо. Это исключительно полезно, а также очень просто.
  • 0
    Вышеуказанное решение не помогло мне. Это лучшее руководство для Windows: stackoverflow.com/questions/5720484/…
Показать ещё 4 комментария
32

Ruby не может найти доверенные корневые сертификаты.

Взгляните на это сообщение в блоге: " Ruby 1.9 и ошибка SSL.

Решение заключается в установке порта curl-ca-bundle, который содержит те же корневые сертификаты, что и Firefox:

sudo port install curl-ca-bundle

и сообщите объекту https, чтобы использовать его:

https.ca_file = '/opt/local/share/curl/curl-ca-bundle.crt'

Обратите внимание, что если вы хотите, чтобы ваш код запускался на Ubuntu, вам нужно вместо этого установить атрибут ca_path с расположением сертификатов по умолчанию /etc/ssl/certs.

  • 8
    Похоже, что это происходит и в Windows, и в этом случае рекомендованное решение не сработает.
  • 0
    это хорошо работает с Net :: HTTP.
21

Проблема заключается в том, что Ruby не может найти корневой сертификат для доверия. С 1,9 рубина проверяет это. Вам нужно будет убедиться, что у вас есть сертификат curl в вашей системе в виде файла pem. Вам также необходимо убедиться, что сертификат находится в том месте, которое ожидает Ruby. Вы можете получить этот сертификат...

http://curl.haxx.se/ca/cacert.pem

Если ваш пользователь RVM и OSX, то ваше местоположение файла сертификата будет зависеть от того, какую версию рубина вы используете. Установка пути явно с помощью: ca_path - идея BAD, поскольку ваш код не будет переносимым, когда он начнет работать. Там, где вы хотите предоставить рубину сертификат в местоположении по умолчанию (и предположите, что ваши разработчики знают, что они делают). Вы можете использовать dtruss для работы там, где система ищет файл сертификата.

В моем случае система искала файл cert в

/Users/stewart.matheson/.rvm/usr/ssl/cert.pem

однако система MACOSX ожидает сертификат в

/System/Library/OpenSSL/cert.pem

Я скопировал загруженный сертификат на этот путь, и он сработал. НТН

  • 2
    Для меня в Ubuntu 12.04 путь сертификата, который работает, ~/.rvm/usr/ssl/cert.pem
  • 0
    Как вы используете dtruss, чтобы определить, где система ищет сертификат?
Показать ещё 3 комментария
19

Причина, по которой вы получаете эту ошибку в OSX, - это рубин, установленный rvm.

Если вы столкнетесь с этой проблемой в OSX, вы можете найти очень широкое объяснение этого в этом сообщении в блоге:

http://toadle.me/2015/04/16/fixing-failing-ssl-verification-with-rvm.html

Краткая версия заключается в том, что для некоторых версий Ruby RVM загружает предварительно скомпилированные двоичные файлы, которые ищут сертификаты в неправильном месте. Заставляя RVM загружать исходный код и компилировать его на своем собственном компьютере, вы гарантируете правильную настройку местоположения сертификата.

Команда для этого:

rvm install 2.2.0 --disable-binary

Если у вас уже есть версия, вы можете ее установить с помощью:

rvm reinstall 2.2.0 --disable-binary

(очевидно, замените свою рубиновую версию по мере необходимости).

  • 0
    Это сработало для меня. Сообщение в блоге, на которое вы указываете, также полезно, спасибо!
  • 2
    Это сработало для меня на Эль-Капитане. Я взорвался RVM (RVM Implode). Установлен снова с помощью \curl -sSL https://get.rvm.io | bash -s stable --autolibs=homebrew а затем rvm install <ruby-version> --disable-binary В какой-то момент я также сделал rvm get head как это некоторые проблемы.
Показать ещё 1 комментарий
19

Новый сертифицированный жемчуг предназначен для устранения этого:

https://github.com/stevegraham/certified

  • 0
    работал на меня. osx горный лев / рвм / 1,9
  • 10
    не работает для ruby 2.0
Показать ещё 4 комментария
16

В Mac OS X Lion с последним macport:

sudo port install curl-ca-bundle  
export SSL_CERT_FILE=/opt/local/share/curl/curl-ca-bundle.crt  

Затем перезапустите неудавшееся задание.

Примечание. Расположение файла сертификата, похоже, изменилось с тех пор, как 12 мая Эрик G ответил.

  • 0
    После всех поисков и множества попыток, это было единственное, что решило проблему. Спасибо!
  • 0
    Тоже самое. Спасибо приятель!
Показать ещё 2 комментария
14

Один liner исправляет его для Windows в приглашении администратора

choco install wget (сначала см. chocolatey.org)

wget http://curl.haxx.se/ca/cacert.pem -O C:\cacert.pem && setx /M SSL_CERT_FILE "C:\cacert.pem"

Или просто сделайте следующее:

gem sources -r https://rubygems.org/
gem sources -a http://rubygems.org/

Миланский метод:

gem sources -r https://rubygems.org
gem sources -a http://rubygems.org 
gem update --system
gem sources -r http://rubygems.org
gem sources -a https://rubygems.org

gem install [NAME_OF_GEM]
  • 0
    отличный ответ решил мою проблему
  • 1
    Небольшое улучшение - вам просто нужно обновить ruby, а затем вы можете добавить источник https обратно - это просто работает для меня как прелесть: источники gem -r rubygems.org => источники gem -a rubygems.org => обновление gem -system => источники драгоценных камней -r rubygems.org => источники драгоценных камней -a rubygems.org => установка драгоценных камней [NAME_OF_GEM]
13

Просто добавьте gem 'certified' в свой gemfile и запустите установку пакета.

  • gem сертифицированный
  • установить пакет
  • 0
    Подтверждение того, что это помогло на Эль-Капитан. Спасибо!
  • 0
    очень точное решение, спасибо
Показать ещё 3 комментария
13

Хорошо, это сработало для меня

rvm pkg install openssl
rvm reinstall 1.9.2 --with-openssl-dir=$rvm_path/usr

Что-то не так с реализацией opensl моего ubuntu 12.04

  • 1
    У меня такая же проблема
  • 3
    Это работает, но мне пришлось закончить с этим: curl -O http://curl.haxx.se/ca/cacert.pem , mv cacert.pem cert.pem , mv cert.pem $rvm_path/usr/ssl
Показать ещё 1 комментарий
12

Я попробовал установить curl-ca-bundle с помощью brew, но пакет больше недоступен:

$ brew install curl-ca-bundle
Error: No available formula for curl-ca-bundle 
Searching formulae...
Searching taps...

Решение, которое работало со мной на Mac, было:

 $ cd /usr/local/etc/openssl/certs/
 $ sudo curl -O http://curl.haxx.se/ca/cacert.pem

Добавьте эту строку в свой ~/.bash_profile (или ~/.zshrc для zsh):

export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cacert.pem

Затем обновите свой терминал:

$ source ~/.bash_profile
  • 1
    Это сработало для меня - но путь неправильный. Должно быть: export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cacert.pem
  • 2
    Это хорошее решение из-за его простоты. Также, ссылаясь на добавленный сертификат в ~/.bash_profile , он оставляет напоминание о том, что было добавлено (и, что особенно важно, где), когда требуются дальнейшие обновления.
Показать ещё 2 комментария
12

Вот еще один вариант для целей отладки.

Обязательно никогда не используйте это в какой-либо производственной среде, так как это отрицательно скажется на преимуществах использования SSL. Это действительно справедливо для этого в вашей локальной среде разработки.

require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
  • 0
    Большое спасибо, это помогло мне загрузить видео на YouTube с самоцветом youtube_it.
  • 25
    Даунтинг: Да, это работает, но барьер для установки действительного пакета CA и фактического решения проблемы настолько низок, что подобное решение, которое почти полностью лишает безопасности SSL, не является решением, которое должно быть реализовано, если вы Вы находитесь в среде, где центр сертификации полностью недоступен (и даже в этом случае вам следует создать локальный центр сертификации, доступный для обеих конечных точек).
Показать ещё 7 комментариев
11

Хотя я знаю это скорее хромающее решение, я по-прежнему разделяю это, потому что кажется, что очень мало людей, отвечающих здесь, используют Windows, и я думаю, что некоторые из пользователей Windows (включая меня) простой и интуитивно понятный подход.

require 'openssl'
puts OpenSSL::X509::DEFAULT_CERT_FILE

Это указывает, где ваш openssl ищет файл сертификата. Меня зовут Луис, но мой был C:/Users/Luis/Code/luislavena/knap-build/var/knapsack/software/x86-windows/openssl/1.0.0l/ssl/cert.pem. Путь может быть различным в зависимости от каждой собственной среды (например, openknapsack вместо luislavena).

Путь не изменился даже после set SSL_CERT_FILE=C:\foo\bar\baz\cert.pem через консоль, , поэтому... Я создал каталог C:\Users\Luis\Code\luislavena\knap-build\var\knapsack\software\x86-windows\openssl\1.0.0l\ssl на своем локальном диске и поместил в него файл cert.

Как бы то ни было, это будет работать.

  • 2
    Brilliant. Хаки, но это было единственное, что решило мою проблему.
  • 0
    На Windows я решил с: github.com/stevegraham/certific
Показать ещё 1 комментарий
10

У меня была эта же проблема во время работы над проектом Ruby. Я использую Windows 7 64bit.

Я решил это:

  • Загрузка файла cacert.pem из http://curl.haxx.se/ca/cacert.pem.
  • Сохраненный файл C:/RubyCertificates/cacert.pem
  • Затем установите мою переменную окружения "SSL_CERT_FILE" в "C:\RubyCertificates\cacert.pem"

источник: https://gist.github.com/fnichol/867550

  • 0
    Поскольку это Windows, в значении переменной среды следует использовать обратную косую черту.
  • 0
    это единственное решение, которое сработало для исправления «связки» для меня, после исправления ошибки rubygems ssl
7

Самый простой ответ, который работал у меня, - это

sudo apt-get install openssl ca-certificates

И вуаля!!!

  • 1
    Жаль, что я не мог голосовать больше, чем один раз, потому что ты просто сэкономил мне столько времени!
  • 1
    @ Стефан - я бы тоже хотел :-). Это сэкономило мне много времени, поэтому я решил опубликовать его здесь, и это может помочь кому-то еще.
6

OS X 10.8.x с Homebrew:

brew install curl-ca-bundle
brew list curl-ca-bundle
cp /usr/local/Cellar/curl-ca-bundle/1.87/share/ca-bundle.crt /usr/local/etc/openssl/cert.pem
  • 1
    У меня работает и на 10,9.
  • 1
    Хорошо для меня, OS X 10.9.1. Потрясающие!
Показать ещё 2 комментария
4

Я столкнулся с этой проблемой, и предлагаемое исправление rvm osx-ssl-certs update all не работало, несмотря на то, что я являюсь пользователем RVM в OSX.

Исправление, которое сработало для меня, это переустановка последней версии openssl:

brew update
brew remove openssl
brew install openssl
  • 1
    спас мой день Спасибо!
4

Это сработало для меня. Если вы используете rvm и brew:

rvm remove 1.9.3
brew install openssl
rvm install 1.9.3 --with-openssl-dir=`brew --prefix openssl`
4

Затем, как говорится в этом сообщении в блоге,

" Как вылечить Net:: HTTPs рискованное поведение по умолчанию HTTPS"

вы можете захотеть установить драгоценный камень always_verify_ssl_certificates, который позволит вам установить значение по умолчанию для ca_file.

3

Я исправил эту проблему, выполнив ее в терминале. Полная запись доступна через здесь

rvm install 2.2.0 --disable-binary
3

Решение OSX:

установить последнюю стабильную версию rvm

rvm get stable

использовать команду rvm для автоматического разрешения сертификатов

rvm osx-ssl-certs update all
  • 1
    Я попробовал это, и это не сработало для меня. Вот мое решение: stackoverflow.com/a/16741712/62
  • 0
    У меня сработало после установки Ruby 2.0.0 через RVM.
2

Если у вас есть символическая ссылка в /usr/local/etc/openssl, указывающая на cert.pem, попробуйте сделать это:

ruby -ropenssl -e "p OpenSSL::X509::DEFAULT_CERT_FILE" (should be /usr/local/etc/openssl)
cd /usr/local/etc/openssl
wget http://curl.haxx.se/ca/cacert.pem
ln -s cacert.pem 77ee3751.0 (77ee3751.0 is my symbolic link, should depend on the openssl version)
2

Просто потому, что инструкции были немного разными для того, что сработало для меня, я думал, что добавляю свои 2 цента:

Я нахожусь в OS X Lion и использую macports и rvm

Я установил curl-ca-bundle:

sudo port install curl-ca-bundle

Затем я скорректировал свою конфигурацию omniauth следующим образом:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :google_oauth2, APP_CONFIG['CONSUMER_KEY'], APP_CONFIG['CONSUMER_SECRET'],
           :scope => 'https://www.google.com/m8/feeds https://www.googleapis.com/auth/userinfo.profile',
           :ssl => {:ca_path => "/share/curl/curl-ca-bundle.crt"}
end
  • 0
    Вы можете (и, вероятно, должны) отказаться от всего зоопарка CA ( ca-bundle.crt ) и использовать Google Internet Authority G2 в :ssl => {:ca_path => "/share/curl/curl-ca-bundle.crt"} , Это единственное, что необходимо для сертификации соединений с Google.
2

Вот что я сделал, что помогло, если у вас есть проблема с Leopard.

Мой сертификат был старым и нуждался в обновлении. Я скачал это:

http://curl.haxx.se/ca/cacert.pem

Затем заменил мой сертификат, который был найден здесь на Leopard:

/usr/share/curl/curl-ca-bundle.crt

Перезагрузите все, что у вас есть, и вы должны быть добрыми!

1

Что сработало для меня - это комбинация ответов, а именно:

# Reinstall OpenSSL
brew update
brew remove openssl
brew install openssl
# Download CURL CA bundle
cd /usr/local/etc/openssl/certs
wget http://curl.haxx.se/ca/cacert.pem
/usr/local/opt/openssl/bin/c_rehash
# Reinstall Ruby from source
rvm reinstall 2.2.3 --disable-binary
1

Последняя версия rubygem-update-2.6.7 разрешила эту проблему. http://guides.rubygems.org/ssl-certificate-update/

1

Мне пришлось переустановить Ruby. Это должно решить его, если вы используете Ubuntu и rbenv:

rbenv uninstall your_version

# install dependencies
sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev

# install ruby with patch
curl -fsSL https://gist.github.com/mislav/055441129184a1512bb5.txt | \
  rbenv install --patch your_version

Для получения дополнительной информации ознакомьтесь с rbenv Wiki по этому вопросу.

1

Просто запустите исполняемый файл certified-update, и эта команда сделает все ваши сертификаты актуальными.

Это работало для моего приложения Ruby on Rails в Windows.

1

Добавление gem 'certified', '~> 1.0' в мой Gemfile и запуск bundle решил эту проблему для меня.

1

Если вы используете локальное приложение rails, просто добавьте эту строку в конец приложения .rb.

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

После этого вы можете использовать приложение без каких-либо проблем. Вы можете назвать это взломом, но это не рекомендуется. Используйте только в том случае, если вам нужно выполнить локальную работу

1

У меня были проблемы в течение нескольких дней и был взломан. Эта ссылка оказалась для меня очень полезной. Это помогло мне сделать успешное обновление SSL на MAC OS X 9.

0

Добавьте это в свой gemfile:

gem 'cliver', :git => 'git://github.com/yaauie/cliver', :ref => '5617ce'

0

Установка следующего пакета на Ubuntu исправила проблему для меня

sudo apt-get install libssl-dev

0

Когда-то это не всегда проблема с rvm в MAC OSX, если вы удалите .rvm, проблема все еще (особенно при резервном копировании данных из timemachine), вы можете попробовать этот путь.

1.brew update
2.brew install openssl
0

Это может быть проблема с поврежденными/недействительными сертификатами SSL. На mac вы можете использовать эту команду для обновления SSL-сертификатов:

rvm osx-ssl-certs update all

Ещё вопросы

Сообщество Overcoder
Наверх
Меню