"Ошибка проверки сертификата" Ошибка OpenSSL при использовании Ruby 1.9.3

Я использую 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? Является ли мое решение правильным способом решения этого вопроса?

Ответ 1

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

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

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

Ответ 2

Для меня это произошло на 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.

У меня был путь /usr/local/etc/openssl, но не cert.pem в этом каталоге, поэтому я не уверен, почему RVM утверждала, что сертификаты были обновлены. Было бы неплохо узнать, почему я должен был сделать это на первом месте, но у меня нет времени на расследование.

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

Каталог сертификации 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

Ответ 6

Возможно, это из-за того, как вы построили 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'

(если вы хотите просмотреть diff...)

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

Ответ 7

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

Подробный ответ здесь: fooobar.com/info/26443/...