Я использую 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/...