Не удалось проверить сертификат Ruby и OpenSSL

Я почти уверен, что попробовал все под солнцем. Вот код, который я пытаюсь запустить

require 'rubygems'
require 'rest-client'
require 'json'

def vipr_session(viprurl, username, password)
  vipr_session_link = RestClient::Resource.new(viprurl + '/login', username, password)
  vipr_session_response = vipr_session_link.get
  myvar = 'x_sds_auth_token'
  @mysession = vipr_session_link.headers[myvar.to_sym]
end

@username = 'root'
@password = 'mypw'
@viprurl = 'https://192.168.50.141:4443'

print " Logging into ViPR..."
  vipr_session(@viprurl, @username, @password)
print "Success! \n\n\n"
puts @mysession
storagesystems = JSON.parse(RestClient.get(@viprurl + '/vdc/storage-systems', :x_sds_auth_token => @mysession, :content_type => :json, :accept => :json))
puts storagesystems

Вот ошибка

kcoleman-mbp:vipr_scripts kcoleman$ ruby storage_systems.rb
 Logging into ViPR.../Users/kcoleman/.rvm/gems/ruby-2.1.2/gems/rest-client-1.7.2/lib/restclient/request.rb:445:in `rescue in transmit': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (RestClient::SSLCertificateNotVerified)
    from /Users/kcoleman/.rvm/gems/ruby-2.1.2/gems/rest-client-1.7.2/lib/restclient/request.rb:350:in `transmit'
    from /Users/kcoleman/.rvm/gems/ruby-2.1.2/gems/rest-client-1.7.2/lib/restclient/request.rb:176:in `execute'
    from /Users/kcoleman/.rvm/gems/ruby-2.1.2/gems/rest-client-1.7.2/lib/restclient/request.rb:41:in `execute'
    from /Users/kcoleman/.rvm/gems/ruby-2.1.2/gems/rest-client-1.7.2/lib/restclient/resource.rb:51:in `get'
    from storage_systems.rb:8:in `vipr_session'
    from storage_systems.rb:18:in `<main>'

Я могу сделать это, установив verify_ssl: false в RestClient, но этот код работал ранее, и внезапно он больше не работает.

Вот что я сделал, чтобы попытаться исправить:

rvm osx-ssl-certs update all
brew install openssl
brew link openssl --force
brew tap raggi/ale
brew install openssl-osx-ca
rvm pkg install openssl
curl http://curl.haxx.se/ca/cacert.pem -o /usr/local/etc/openssl/cert.pem

Вот мои текущие конфиги

kcoleman$ which openssl
/usr/local/bin/openssl
kcoleman$ openssl version
OpenSSL 1.0.1i 6 Aug 2014

Я наткнулся на эту статью SSLError и Rubyist, сидя на дереве, и это вывод сценария doctor.rb.

kcoleman-mbp:ssl-tools kcoleman$ ruby doctor.rb 192.168.50.141:4443
/Users/kcoleman/.rvm/rubies/ruby-2.1.2/bin/ruby (2.1.2-p95)
OpenSSL 1.0.1g 7 Apr 2014: /etc/openssl
SSL_CERT_DIR=""
SSL_CERT_FILE=""

HEAD https://192.168.50.141:4443
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

The server presented a certificate that could not be verified:
  subject: /CN=192.168.50.140
  issuer: /CN=192.168.50.140
  error code 18: self signed certificate

Похоже, что ruby ​​использует другую версию OpenSSL, которая поставляется вместе с RVM. Проверено запуском установки openssl на rvm.

kcoleman-mbp:vipr_scripts kcoleman$ rvm pkg install openssl

Beware, 'rvm pkg ...' is deprecated, read about the new autolibs feature: 'rvm help autolibs'.

Checking requirements for osx.
Certificates in '/usr/local/etc/openssl/cert.pem' are already up to date.
Requirements installation successful.
Fetching openssl-1.0.1g.tar.gz to /Users/kcoleman/.rvm/archives
Extracting openssl to /Users/kcoleman/.rvm/src/openssl-1.0.1g....
Configuring openssl in /Users/kcoleman/.rvm/src/openssl-1.0.1g.......................
Compiling openssl in /Users/kcoleman/.rvm/src/openssl-1.0.1g...........................................................................................-
Installing openssl to /Users/kcoleman/.rvm/usr

Если у вас есть идеи, что попробовать, это очень ценится.

1 ответ

Решение
ГОЛОВА https://192.168.50.141:4443
OpenSSL::SSL::SSLError: возвращено SSL_connect =1 errno=0 состояние =SSLv3 чтение сертификата сервера B: сбой проверки сертификата

Сервер представил сертификат, который не может быть проверен:
  предмет: /CN=192.168.50.140
  эмитент: /CN=192.168.50.140
  код ошибки 18: самозаверяющий сертификат

Есть несколько вещей, которые не так с вашим сертификатом, которые делают проверку неудачной:

  • Сертификат является самозаверяющим и, следовательно, не может быть проверен с помощью локальной доверенной привязки. Принятие такого сертификата равносильно принятию любого паспорта, который кто-то создал для себя, а не только паспортов, выпущенных доверенными правительствами.
  • Субъект сертификата не соответствует имени, которое вы использовали для подключения к нему. Сертификат предназначен для 192.168.50.140, но вы обращаетесь к хосту как 192.168.50.141 (возможно, из-за того, что в сертификате больше IP-адресов в качестве альтернативного имени субъекта, которые здесь не показаны). Не проверка имени в сертификате равносильна проверке фотографии в паспорте с предъявителем паспорта.
Другие вопросы по тегам