Ich habe RVM verwendet, um Ruby 1.9.3 unter Ubuntu 12.04 zu installieren
rvm pkg install openssl
rvm install 1.9.3 --with-openssl-dir=$rvm_path/usr
Und dann, wenn ich versuche, etwas wie folgt auszuführen:
require 'open-uri'
open('https://www.google.com/')
Ich erhalte die Fehlermeldung: OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
Wie löse ich das? Ich habe viele ähnliche Threads, bei denen dieses Problem in OSX auftritt, aber wie löse ich es in Ubuntu?
Danke für Ihre Hilfe.
Dies geschieht manchmal, wenn das Standard-OpenSSL-Verzeichnis in der nativen OpenSSL-Bibliothek nicht korrekt festgelegt ist. open-uri verwendet OpenSSL::X509::Store#set_default_paths
, um OpenSSL mitzuteilen, im OpenSSL-Verzeichnis nach der Datei zu suchen, die die vertrauenswürdigen Stammzertifikate enthält, die OpenSSL standardmäßig als vertrauenswürdig einstuft.
In Ihrem Fall schlägt diese Suche fehl. Sie können dies zum Erfolg führen, indem Sie eine Umgebungsvariable festlegen, die die Standardeinstellung überschreibt und OpenSSL anweist, stattdessen in diesem Verzeichnis zu suchen:
export SSL_CERT_FILE=/etc/pki/tls/cert.pem
Dies ist der Standardspeicherort für das Stamm-CA-Paket auf meinem Fedora 16 64-Bit. Weitere beliebte Speicherorte sind /etc/ssl/ca-bundle.crt usw. In Ihrem Fall befindet sich die von RVM verwendete OpenSSL-Bibliothek in $ rvm_path/usr. Daher sollten Sie sich dort nach einem geeigneten Kandidaten für die Standard-CA-Stammdatei umsehen. Nachdem die Umgebungsvariable korrekt festgelegt wurde, ist der Aufruf von open-uri erfolgreich.
Um die Umgebungsvariable dauerhaft zu machen, verwenden Sie die üblichen Methoden, beispielsweise den Export in .bashrc,/etc/profile oder was auch immer in Ihre Situation passt.
Die Datei "cacert.pem" fehlt bei installiertem Rvm-openssl.
$ cd $rvm_path/usr/ssl
$ Sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ Sudo mv cacert.pem cert.pem
Fügen Sie den "zertifizierten" Edelstein zu Ihrem Gemfile hinzu.
Weitere Informationen: https://rubygems.org/gems/certified
Siehe http://jjinux.blogspot.nl/2012/02/Ruby-working-around-ssl-errors-on-os-x.html - Als alternative Antwort auf Ihre Frage sollte es für beide Ubuntu funktionieren und Mac OS X-Benutzer, und es ist keine Änderung der Umgebungsvariablen erforderlich.
Die Lösung aus dem obigen Link:
# 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
Treten Sie diesen Fehler auf einer virtuellen Maschine nach einer langen Zeit (1 Woche) ohne Verwendung aus. Das Aktualisieren meiner Systemuhr hat das Problem sofort behoben.
Wenn Sie ntpd
ausführen, erledigt ntpdate -b -u pool.ntp.org
das für Sie.
Das hat jetzt für mich funktioniert. Dinge fingen an zu arbeiten, als ich "Brew Doctor" lief, was mich zu Hinweisen wie "unset SSL_CERT_DIR" führte.