Ошибка проверки сертификата OpenSSL при использовании Ruby 1.9.3 - PullRequest
18 голосов
/ 12 ноября 2011

Я использую Ruby 1.9.3p0 на Mac OS 10.6.8 (устанавливается с помощью rvm). Когда я пытаюсь создать новое приложение Rails, используя шаблон приложения , размещенный на GitHub , с таким (например):

$ rails new myapp -m https://github.com/RailsApps/rails3-application-templates/raw/master/rails3-mongoid-devise-template.rb -T -O

Я получаю это сообщение об ошибке:

/Users/me/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/net/http.rb:799:in `connect': SSL_connect 
returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed 
(OpenSSL::SSL::SSLError)

Я понимаю, что интерпретатор языка Ruby использует OpenSSL для подключения к GitHub для запроса файла шаблона приложения. GitHub требует, чтобы все соединения выполнялись с использованием SSL. Не удалось установить соединение, поскольку OpenSSL не удалось проверить сертификат сервера.

Мне удалось решить проблему, загрузив файл сертификатов:

$ cd /opt/local/etc/openssl
$ sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ sudo mv cacert.pem cert.pem

У меня не было проблем с использованием Ruby 1.9.2. Почему у меня возникла проблема «проверка сертификата не удалась» для Ruby 1.9.3? Это ошибка Ruby 1.9.3? Это специфично для Mac OS 10.6.8? Является ли мое решение правильным способом решения этой проблемы?

Ответы [ 7 ]

21 голосов
/ 12 мая 2012

Есть много движущихся частей, участвующих в правильном ответе.Зависит от вашей ОС, версии Ruby, версии OpenSSL, версии Rubygems.Я закончил тем, что написал статью после исследования этого.Моя статья объясняет причины ошибки, предлагает шаги для дальнейшей диагностики, показывает несколько обходных путей и предлагает возможные решения.Это будет полезно:

Ошибки и Rails OpenSSL - сбой проверки сертификата

Есть также ссылки на соответствующие коммиты и проблемы на GitHub.

13 голосов
/ 24 мая 2013

Для меня это произошло в OS X с homebrew после обновления до последней версии RVM (rvm 1.20.12) и последующей установки ruby-1.9.3-p429.Я мог воспроизвести проблему, просто набрав:

$ rvm use ruby-1.9.3-p429
$ irb
1.9.3p429 :001 > require 'open-uri'; open 'https://google.com'
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:800:in `connect'
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:800:in `block in connect'
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/timeout.rb:55:in `timeout'
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/timeout.rb:100:in `timeout'
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:800:in `connect'
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:756:in `do_start'
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/net/http.rb:745:in `start'
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:306:in `open_http'
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:775:in `buffer_open'
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop'
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:201:in `catch'
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop'
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri'
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:677:in `open'
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/open-uri.rb:33:in `open'
    from (irb):1
    from /Users/lyahdav/.rvm/rubies/ruby-1.9.3-p429/bin/irb:16:in `<main>'1.9.3p429 :002 > 

Решение было похоже на вопрос в вопросе, но путь был неверным.Запуск этого исправил:

curl https://curl.haxx.se/ca/cacert.pem -o /usr/local/etc/openssl/cert.pem

Ключ к правильному пути был в том, что когда я устанавливал ruby-1.9.3-p429 через RVM, это показывалось в выводе:

Certificates in '/usr/local/etc/openssl/cert.pem' already are up to date.
* 1009У меня был путь /usr/local/etc/openssl, но в этом каталоге нет файла cert.pem, поэтому я не уверен, почему RVM утверждает, что сертификаты были обновлены.Было бы неплохо узнать, почему я должен был сделать это в первую очередь, но сейчас у меня нет времени для расследования.
11 голосов
/ 25 мая 2012

У меня была такая же проблема, скомпилировав мой RVM Ruby против RVM-установки OpenSSL. Я переместил файл cacerts.pem, загруженный оригинальным постером, в ~ / .rvm / usr / ssl / cert.pem, чтобы устранить проблему.

2 голосов
/ 18 февраля 2012

У меня была такая же проблема.

Способ, которым я наконец исправил это, был обновлением моей версии OpenSSL, которую я установил через MacPorts. Я использовал версию OpenSSL с 2009 года, поэтому я обновил установку MacPorts, а затем обновил установку OpenSSL через интерфейс командной строки ports, и ошибка исчезла.

Должна быть некоторая интеграция между Ruby / Rails и OpenSSL в установках на базе Mac, что само собой разумеется. В моем случае у меня были проблемы с тем, чтобы Войти через Facebook для правильной работы, когда Facebook отправлял токен oAuth / Login обратно в мое приложение, Devise & OmniAuth должен был иметь действительный сертификат SSL для graph.facebook.com, не было в моей старой версии OpenSSL.

1 голос
/ 25 августа 2013

Каталог сертификации Openssl - /usr/lib/ssl/ в Debian. Итак, следующих трех строк мне было достаточно,

$ cd /usr/lib/ssl/
$ sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ sudo mv cacert.pem cert.pem
0 голосов
/ 16 февраля 2016

У меня была похожая проблема, но не на Rails, а только на Ruby в Windows.Я решил его, используя cacert.pem сертификат и установив местоположение сертификата для переменной среды "SSL_CERT_FILE"

Подробный ответ здесь: https://stackoverflow.com/a/35429863/4747587

0 голосов
/ 12 ноября 2011

Это может быть из-за того, как вы создали 1.9.2 и 1.9.3 - возможно, из-за того, что вы использовали инструмент для создания каждого настроенного объекта немного по-другому. Или, может быть, они используют разные версии OpenSSL.

Вот единственное потенциально важное изменение, которое я могу заметить в сети: HTTP между 1.9.2 и 1.9.3

 require 'net/protocol'
-autoload :OpenSSL, 'openssl'
 require 'uri'
+autoload :OpenSSL, 'openssl'

(если вы хотите просмотреть разницу ...)

git clone https://github.com/ruby/ruby.git
cd ruby
git diff origin/ruby_1_9_2 origin/ruby_1_9_3 -- http.rb
...