OpenSSL:: SSL:: SSLError: SSL_connect возвращен = 1 errno = 0 state = SSLv3 считать сертификат сервера B: проверка сертификата не выполнена
Я использовал RVM для установки Ruby 1.9.3 на Ubuntu 12.04, выполнив
rvm pkg install openssl
rvm install 1.9.3 --with-openssl-dir=$rvm_path/usr
И затем, когда я пытаюсь запустить что-то по строкам:
require 'open-uri'
open('https://www.google.com/')
Я получаю ошибку: OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
Как я могу это решить? У меня много похожих тем, где у людей есть эта проблема в OSX, но как я могу ее разрешить в Ubuntu?
Спасибо за вашу помощь.
Ответы
Ответ 1
Это иногда происходит, если по умолчанию "OpenSSL-каталог" установлен неправильно с помощью собственной библиотеки OpenSSL. open-uri использует OpenSSL::X509::Store#set_default_paths
, чтобы сообщить OpenSSL посмотреть в каталоге OpenSSL файл, содержащий доверенные корневые сертификаты, которым по умолчанию доверяет OpenSSL.
В вашем случае этот поиск не выполняется. Вы можете добиться успеха, установив переменную окружения, которая переопределяет настройку по умолчанию и предложит OpenSSL вместо этого посмотреть в этом каталоге:
export SSL_CERT_FILE=/etc/pki/tls/cert.pem
Это расположение по умолчанию для корневого пакета CA на моем 64-битном Fedora 16, другие популярные местоположения:/etc/ssl/ca-bundle.crt и т.д. В вашем случае библиотека OpenSSL, используемая RVM, находится в $rvm_path/usr, поэтому вы должны посмотреть вокруг там, где есть подходящий кандидат для файла CA корня по умолчанию. После правильной установки переменной окружения вызов open-uri будет успешным.
Чтобы переменная среды была постоянной, используйте обычные способы, такие как определение экспорта в .bashrc,/etc/profile или все, что лучше подходит для вашей ситуации.
Ответ 2
Файл cacert.pem отсутствует в rvm, установленном openssl.
$ cd $rvm_path/usr/ssl
$ sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ sudo mv cacert.pem cert.pem
Ответ 3
Добавьте "сертифицированный" камень в свой Gemfile.
Дополнительная информация: https://rubygems.org/gems/certified
Ответ 4
См. http://jjinux.blogspot.nl/2012/02/ruby-working-around-ssl-errors-on-os-x.html в качестве альтернативного ответа на ваш вопрос, он должен работать как для пользователей Ubuntu, так и для Mac OS X, и это не требуют изменения переменных среды.
Решение по приведенной выше ссылке:
# config/initializers/fix_ssl.rb
#
# Work around errors that look like:
#
# SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
require 'open-uri'
require 'net/https'
module Net
class HTTP
alias_method :original_use_ssl=, :use_ssl=
def use_ssl=(flag)
# Ubuntu
if File.exists?('/etc/ssl/certs')
self.ca_path = '/etc/ssl/certs'
# MacPorts on OS X
# You'll need to run: sudo port install curl-ca-bundle
elsif File.exists?('/opt/local/share/curl/curl-ca-bundle.crt')
self.ca_file = '/opt/local/share/curl/curl-ca-bundle.crt'
end
self.verify_mode = OpenSSL::SSL::VERIFY_PEER
self.original_use_ssl = flag
end
end
end
Ответ 5
Теперь это работало для меня. Вещи, начинающие работать, когда я запускал "brew doctor", что привело меня к подсказкам вроде "unset SSL_CERT_DIR"
Ответ 6
Проверьте системные часы!
Удалите эту ошибку на виртуальной машине после длительного периода (1 неделя) без использования. Обновление системных часов немедленно устранило проблему.
Если вы используете ntpd
, тогда ntpdate -b -u pool.ntp.org
сделает это для вас.