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

281

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

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

Журнал разработки показывает

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'

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

Vikash
источник
2
Помогает ли это: stackoverflow.com/q/3977303/382818
Забба
Вот лучшее решение, которое я смог найти на сегодняшний день stackoverflow.com/a/16983443/11792
Павел Николов

Ответы:

138

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

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

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

    • sudo port install curl-ca-bundle [если вы используете MacPorts]
    • или просто потяните его вниз wget http://curl.haxx.se/ca/cacert.pem
  2. Исполнить код рубин , который пытается проверить сертификат 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 (я не пробовал) в ОС - есть длинные инструкции здесь - это должно работать подобным образом, но я не пробовал это лично.

По сути, проблема, с которой вы сталкиваетесь, заключается в том, что некоторые веб-службы отвечают сертификатом, подписанным против 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
andersjanmyr
5
У меня не было / usr / local / etc / openssl, поэтому я побежал, sudo curl http://curl.haxx.se/ca/cacert.pem >> /usr/local/etc/cacert.pemа затем export SSL_CERT_FILE=/usr/local/etc/cacert.pem
Lilith River
4
Разрабатывая на моем Mac, я только добавил SSL_CERT_FILE=/usr/local/etc/openssl/cert.pemв .envфайл своего приложения и вуаля - все счастливы.
Дэйв Сэг
8
Я ценю иронию использования wget для загрузки сертификатов curl.
Трей
135

Если вы используете 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


Обновить

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

rvm reinstall 2.2.3 --disable-binary

Благодарим https://stackoverflow.com/a/32363597/4353 и Иана Коннора .

htanata
источник
2
Вот гораздо более полная рецензия с альтернативами: railsapps.github.io/openssl-certificate-verify-failed.html
Питер П.
ОШИБКА: обновление rvm было удалено. Вместо этого смотрите API CLI 'rvm get' и rvm 'rubygems'
Ян
@ user432506 Как вы получили эту ошибку? Я использую последний стабильный RVM, и он все еще работает.
htanata
4
Это будет работать некоторое время, а затем потерпит неудачу для меня. То, что работало для меня, работало, rvm reinstall 2.2.0 --disable-binaryно затем вы должны установить и начать все заново.
Ян Коннор
2
Это было огромное спасение жизни и должно быть принятым ответом.
Siraris
129

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

Выдержка:

Ручной путь (скучно)

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

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

set SSL_CERT_FILE=C:\RailsInstaller\cacert.pem

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

ryanjones
источник
6
Спасибо. Это исключительно полезно, а также очень просто.
Джон
Вышеуказанное решение не помогло мне. Это лучшее руководство для Windows: stackoverflow.com/questions/5720484/…
Sprachprofi
@Sprachprofi Решение, с которым вы связались, будет работать только для 1 проекта рельсов за раз (как вы указываете непосредственно на этот сертификат). Суть, на которую я ссылаюсь (созданная Флетчером Николом), позволит охватить каждый проект / драгоценный камень, который ищет сертификат.
ryanjones
31

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.

martoche
источник
8
Похоже, что это происходит и в Windows, и в этом случае рекомендуемое решение не будет работать.
Боб Аман
24

Причиной возникновения этой ошибки в OSX является установленный rvm ruby.

Если вы столкнулись с этой проблемой на 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

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

paulmorar
источник
Это сработало для меня. Сообщение в блоге, на которое вы указываете, также полезно, спасибо!
Кристиан
2
Это сработало для меня на Эль-Капитане. Я взорвался RVM (RVM Implode). Установлен снова с, \curl -sSL https://get.rvm.io | bash -s stable --autolibs=homebrewа затем rvm install <ruby-version> --disable-binary В какой-то момент я также сделал, так rvm get headкак это некоторые передовые проблемы
rylanb
У меня работало только это решение, потому что изначально у меня был Ruby 2.0.0 на El Capitan и по какой-то причине старая версия не работала даже с правильной версией SSL_CERT_FILE. После rvm install 2.2.0 --disable-binaryэтого вопрос отсортирован.
августа
20

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

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

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

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

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

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

/System/Library/OpenSSL/cert.pem

Я скопировал скачанный сертификат по этому пути, и он работал. НТН

Стюарт
источник
2
Для меня на Ubuntu 12.04, сертификационный путь, который работает~/.rvm/usr/ssl/cert.pem
Назар Хуссейн
Как вы используете dtruss, чтобы определить, где система ищет сертификат?
Pingu
@pingu не может вспомнить точную команду, в основном вы запускаете druss и говорите ему запускать какой-либо ruby-процесс, который вы хотите, чтобы он "проверял". Вывод очень подробный, но в основном вы сможете увидеть каждый системный вызов ruby. Один из вызовов будет вызовом чтения файла, который будет указывать на файл, который не существует. Переместите сертификат сюда или создайте ссылку, и вы должны быть готовы.
Стюарт
Ruby не следует искать cacert.pemна OS X. OS X не использует cacert.pem. Системные и пользовательские сертификаты хранятся в KeyChain. Рубин следует интегрировать с брелка на OS X.
jww
Каков наилучший способ сделать это? Можете опубликовать пример?
Стюарт
19

Новый сертифицированный драгоценный камень разработан, чтобы исправить это:

https://github.com/stevegraham/certified

Kevin
источник
Работает с ruby ​​2.0.0p481 (2014-05-08) [i386-mingw32]
Евморов
1
У меня не работает Rails 4.1.9, ruby-2.1.5. Я добавил его в Gemfile, bundleявно добавил, require "certified"просто чтобы быть уверенным, и ничего не меняется. Чего мне не хватает?
Исаак Бетеш
Ruby не следует искать cacert.pemна OS X. OS X не использует cacert.pem. Системные и пользовательские сертификаты хранятся в KeyChain. Ruby должен интегрироваться с KeyChain на OS X. OpenSSL никогда не распространял cacert.pem. Мне не ясно, почему любое программное обеспечение откладывает для этого OpenSSL.
jww
18

Просто добавьте gem «Certified» в ваш gemfile и запустите пакетную установку.

  1. драгоценный камень " сертифицирован "
  2. комплектация
Нитиш Кумар
источник
Подтверждение, что это помогло на Эль-Капитан. Спасибо!
mcmlxxxiii
Он отлично работает с Rails и Debian :) большое спасибо!
Шимон Рут
17

В Mac OS X Lion с последней версией Macport:

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

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

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

Майк
источник
После всех поисков и множества попыток, это было единственное, что решило проблему. Спасибо!
Шонуолл
1
круто, что починил. Но до тех пор, пока openssl установлен с homebrew, вы должны добавить export SSL_CERT_FILE=/usr/local/etc/openssl/cacert.pemв свой файл .profile или .bashrc
23tux
14

Один вкладыш исправляет это для 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]
Джонатан
источник
1
Небольшое улучшение - вам просто нужно обновить ruby, а затем вы можете добавить исходный код https - это просто работает для меня как прелесть: gem sources -r rubygems.org => gem sources -a rubygems.org => gem update --system => источники драгоценных камней -r rubygems.org => источники драгоценных камней -a rubygems.org => установка драгоценных камней [NAME_OF_GEM]
milanio
13

Ну, это сработало для меня

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

Что-то не так с реализацией openssl моей Ubuntu 12.04

Рамасами
источник
3
Это работает, но я должен был закончить с этим: curl -O http://curl.haxx.se/ca/cacert.pem, mv cacert.pem cert.pem,mv cert.pem $rvm_path/usr/ssl
Raf
У меня работал Mac OS X Yosemite. Спасибо!
19
12

Зная, что это довольно слабое решение, я все же делюсь этим, потому что кажется, что очень немногие люди, отвечающие здесь, используют 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 на своем локальном диске и поместил в него файл сертификата.

Хм, как это, это, безусловно, будет работать.

QUV
источник
2
Brilliant. Хаки, но это было единственное, что решило мою проблему.
Даниэль Маглиола
Хороший способ отладки ... Для меня пользователь был "Джастин". Поиск в Google показывает, что это, похоже, известная проблема с RubyInstaller. К сожалению, создание этого каталога (+ pem-файл) самостоятельно не решило проблему для меня
Wouter
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
monteirobrena
источник
1
Это сработало для меня - но путь неправильный. Должно быть:export SSL_CERT_FILE=/usr/local/etc/openssl/certs/cacert.pem
dnlmzw
2
Это хорошее решение из-за его простоты. Кроме того, ссылаясь на добавленный сертификат ~/.bash_profile, он оставляет напоминание о том, что было добавлено (и, что особенно важно, где), когда требуются дополнительные обновления.
auxbuss
Это сработало для меня. @dnlmzw путь был хорош для меня, но, конечно, это зависит от ваших настроек. Спасибо!
theartofbeing
у меня не получилось, когда я пытался добавить частный URL-адрес гем-сервера, использующий самозаверяющий сертификат, к моим источникам. OSX 10.11.6 + rbenv
шестьдесят
12

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

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

require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
Скотт
источник
26
Даунтинг: Да, это работает, но барьер для установки действительного пакета CA и фактического решения проблемы настолько низок, что подобное решение, которое почти полностью лишает безопасности SSL, не является решением, которое должно быть реализовано, если вы вы находитесь в среде, в которой центр сертификации полностью недоступен (и даже в этом случае вам следует создать локальный центр сертификации, доступный для обеих конечных точек).
Yaauie
10
Он не почти полностью удалил защиту SSL, он полностью удаляет ее. Никогда не делай этого.
drbrain
15
Для отладки достаточно
rickyduck
1
Это выдает предупреждение сейчас в 1.9
Иван
2
Это плохое решение для производственной работы через настоящий Интернет, но совершенно не соответствует действительности то, что «вы также можете вообще не использовать SSL». Трафик, зашифрованный по проводам, лучше, чем трафик в открытом виде. Да, у вас есть возможность атак типа «человек посередине», но это, по крайней мере, на одну ступеньку сложнее, чем просто подслушивать трафик с открытым текстом, когда он скользит.
Марк Рид
10

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

Я решил это путем:

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

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

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

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

sudo apt-get install openssl ca-certificates

И вуаля !!!

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

OS X 10.8.x с домашним пивом:

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. Потрясающие!
rogeriopradoj
Что-то серьезно ломается, когда вам приходится выискивать случайные решения, чтобы решить эти глупые проблемы. Все эти ответы делают что-то совершенно другое, и все они, казалось, помогали людям в какой-то момент. WTF?
sergserg
13
curl-ca-bundle был удален из варева
Fa11enAngel
4

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

rvm remove 1.9.3
brew install openssl
rvm install 1.9.3 --with-openssl-dir=`brew --prefix openssl`
Рахул
источник
4

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

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

brew update
brew remove openssl
brew install openssl
Дэйв Брэйс
источник
4

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

rvm install 2.2.0 --disable-binary
Wraithseeker
источник
3

OSX решение:

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

rvm get stable

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

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

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

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

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

Тарун Рати
источник
2

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

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

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

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

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

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

Musicalmindz
источник
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
Hortitude
источник
Вы можете (и, вероятно, должны) отказаться от всего CA Zoo ( ca-bundle.crt) и использовать Google Internet Authority G2 в :ssl => {:ca_path => "/share/curl/curl-ca-bundle.crt"}. Это единственное, что необходимо для сертификации соединений с Google.
jww
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

Для меня сработала комбинация ответов, а именно:

# 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
Suda
источник
1

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

Упакованы
источник
1

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

1.brew update
2.brew install openssl
Albert.Qing
источник
1

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

user2573222
источник