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
Zabba

Ось найкраще рішення, яке мені вдалося знайти досі 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 від ​​сценарію рубіну. Дякую.
Jignesh Gohel

4
Так, це добре працює на рубіні-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
Річка Ліліт

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-certificate

І ось повне пояснення: 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 та Ian Connor .


2
Ось набагато більш вичерпний опис з альтернативами: railsapps.github.io/openssl-certificate-verify-failed.html
Петро П.

ПОМИЛКА: оновлення rvm видалено. Дивіться «РВМ прибудете» і «РВМ Rubygems» CLI API замість
янь

@ user432506 Як ви отримали цю помилку? Я використовую останній стабільний RVM і він все ще працює.
htanata

4
Це спрацювало б деякий час, потім для мене не вдасться. Те, що для мене працювало, працює, rvm reinstall 2.2.0 --disable-binaryале тоді вам доведеться встановити пакет і почати свіжий.
Ян Коннор

2
Це було величезним рятувальником, і це має бути прийнятою відповіддю.
Сіраріс

129

Ось як це можна виправити в 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
Дякую. Це надзвичайно корисно, а також дуже просто.
Іван

Наведене вище рішення мені не допомогло. Це кращий путівник для Windows: stackoverflow.com/questions/5720484 / ...
Sprachprofi

@Sprachprofi Рішення, з яким ви пов'язуєтесь, одночасно працюватиме лише для одного проекту рейок (як ви вказуєте безпосередньо на цю програму). Суть, з якою я пов’язана (створена Fletcher Nichol), дозволить охопити кожен проект / дорогоцінний камінь, який шукає сертифікат.
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 рубін.

Якщо ви зіткнулися з цією проблемою на 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

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


Це працювало для мене. Блог публікації, на яку ви вказуєте, також корисний, дякую!
Крістіан

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, питання відсортовано.
laimison

20

Проблема полягає в тому, що в рубіні не можна знайти кореневого сертифіката, якому слід довіряти. Станом на 1,9 рубіну це перевіряє. Вам потрібно буде переконатися, що у вас є сертифікат curl у вашій системі у вигляді файлу pem. Вам також потрібно буде переконатися, що сертифікат знаходиться в тому місці, в якому рубін очікує його. Ви можете отримати цей сертифікат на ...

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

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

У моєму випадку система шукала файл cert

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

проте система MACOSX очікує отримання сертифіката в

/System/Library/OpenSSL/cert.pem

Я скопіював завантажений cert на цей шлях, і він спрацював. HTH


2
Для мене на Ubuntu 12.04 шлях, який працює,~/.rvm/usr/ssl/cert.pem
Назар Хуссейн

Як ви використовуєте dtruss, щоб розробити, де система шукає сертифікат?
pingu

@pingu не може згадати точну команду, в основному ви запускаєте druss, і ви говорите їй запустити будь-який процес рубіну, який ви хочете, щоб він "перевірив". Вихід його дуже багатослівний, але в основному ви зможете побачити кожен рубін системного дзвінка. Одним із викликів буде виклик зчитуваного файлу, який буде вказувати на файл, який не існує. Перемістіть сюди або створіть посилання, і вам слід добре піти.
Стюарт

Ruby не повинен шукати cacert.pemна OS X. OS X не використовує cacert.pem. Системні та користувацькі сертифікати зберігаються в KeyChain. Ruby має інтегруватися з KeyChain в ОС X.
15:15

Який найкращий спосіб зробити це? Чи можете ви розмістити приклад?
Стюарт

19

Нова сертифікована дорогоцінна камінь призначена для виправлення цього:

https://github.com/stevegraham/certified


Працює з рубіном 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 ніколи не поширював a cacert.pem. Мені не зрозуміло, чому будь-яке програмне забезпечення відкладається на OpenSSL для цього.
jww

18

Просто додайте gem "сертифікований" у свій gemfile та запустіть пакет встановлення.

  1. дорогоцінний камінь ' сертифікований '
  2. встановити пакет

Підтверджуючи, що це допомогло на Ель-Капітан. Дякую!
mcmlxxxiii

Відмінно працює з Rails та Debian :) велике спасибі!
Szymon Rut

17

На Mac OS X Lion з найновішим макроконтролем:

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

Потім заново пройдіть невдалу роботу.

Зауважте, схоже, що файл файлу cert змінився після того, як Ерік Г відповів 12 травня.


Після всіх пошуків і безлічі спроб це було єдине, що вирішило проблему. Дякую!
Шонволл

1
круто, що це виправило. Але поки встановлено openssl з домашньою мовою, ви повинні додати 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
Невелике вдосконалення - вам просто потрібно оновити рубін, а потім ви можете додати джерело https назад - це просто для мене спрацювало як шарм: gem source -r rubygems.org => gem source -a rubygems.org => gem update --system => gem source -r rubygems.org => gem source -a rubygems.org => gem install [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. Дякую!
anevaude

12

Хоча я знаю, що це досить кульгаве рішення, я все ще ділюсь цим, оскільки, здається, дуже мало людей, які відповідають тут, використовують Windows , і я думаю, що деякі користувачі Windows (включаючи мене) оцінять простий та інтуїтивний підхід.

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

Це говорить про те, де ваш openssl шукає файл cert. Мене звати не Луїс, але моє було 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
Блискуча. Хаккі, але це було єдине, що вирішило мою проблему.
Даніель Магліола

Гарний спосіб налагодження ... Для мене користувачем був "Джастін". Гуглінг показує, що це, здається, відома проблема з 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: /RubyCertificate/cacert.pem
  3. Потім встановіть мій екологічну змінну "SSL_CERT_FILE" на "C: \ RubyCertificate \ cacert.pem"

джерело: https://gist.github.com/fnichol/867550


Оскільки це Windows, зворотні риски слід використовувати у значенні змінної середовища.
Крістіан Бауман

це єдине рішення, яке працювало, щоб виправити "пакет" для мене, після виправлення помилки ssl
рубігем

7

Найпростіша відповідь, яка працювала для мене, була така

sudo apt-get install openssl ca-certificates

І вуаля !!!


1
Хочеться, щоб я міг голосувати не раз, тому що ви просто заощадили мені стільки часу!
Стівен

1
@Stephen - Я теж хочу, щоб ти міг :-). Це заощадило мені багато часу, тому я подумав, що опублікую його тут, і це може допомогти комусь ще.
Пратік Ботерра

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
Гаразд для мене, ОС X 10.9.1. Дивовижно!
rogeriopradoj

Щось сильно порушується, коли вам доведеться розшукувати випадкові рішення, щоб виправити ці німі проблеми. Усі ці відповіді роблять щось зовсім інше, і всі вони, здавалося, допомагають людям у якийсь момент. WTF?
сергсерг

13
curl-ca-bundle було повернуто з варіння
Fa11enAngel


4

Це працювало для мене. Якщо ви використовуєте rvm та варити:

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
Liron Yahdav

Для мене працював після встановлення Ruby 2.0.0 через RVM.
Кріс Пітерс

3

Якщо ви користуєтесь додатком для рейкових систем локально, просто додайте цей рядок у нижній частині application.rb.

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

Після цього ви можете користуватися додатком без проблем. Ви можете назвати це злом, але це не рекомендується. Використовуйте лише тоді, коли вам потрібно працювати локально


2

Ось, що я зробив, що допомогло, якщо у вас є конкретні проблеми з Leopard.

Мій серт був старий і його потрібно було оновити. Я завантажив це:

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

Тоді я скоригував конфігурацію всезнаючого так:

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 ( 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.