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'

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


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 и Иана Коннора .


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

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


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.


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 ​​по мере необходимости).


Это сработало для меня. Сообщение в блоге, на которое вы указываете, также полезно, спасибо!
— Кристиан

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


Работает с 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 на своем локальном диске и поместил в него файл сертификата.

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


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

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

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

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


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

Вы можете (и, вероятно, должны) отказаться от всего 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

1

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


1

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

1.brew update
2.brew install openssl

1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.