it-swarm.com.de

"Zertifikatüberprüfung fehlgeschlagen" OpenSSL-Fehler bei Verwendung von Ruby 1.9.3

Ich verwende Ruby 1.9.3p0 unter Mac OS 10.6.8 (installiert mit rvm). Wenn ich versuche, eine neue Rails-Anwendung mit einer Anwendungsvorlage zu erstellen, die auf GitHub gehostet wird, und zwar (zum Beispiel):

 $ Rails new myapp -m https://github.com/RailsApps/Rails3-application-templates/raw/master/Rails3-mongoid-devise-template.rb -T -O 

Ich bekomme diese Fehlermeldung:

/Users/me/.rvm/rubies/Ruby-1.9.3-p0/lib/Ruby/1.9.1/net/http.rb:799:in `connect ': SSL_connect 
 Wurde zurückgegeben = 1 errno = 0 state = SSLv3-Leseserverzertifikat B: Zertifikatprüfung fehlgeschlagen 
 (OpenSSL :: SSL :: SSLError) 

Ich verstehe, dass der Interpreter der Ruby-Sprache OpenSSL verwendet, um eine Verbindung zu GitHub herzustellen, um die Anwendungsvorlagendatei anzufordern. GitHub erfordert, dass alle Verbindungen mit SSL hergestellt werden. Die Verbindung ist fehlgeschlagen, da OpenSSL das Serverzertifikat nicht überprüfen konnte.

Ich konnte das Problem durch Herunterladen einer Zertifikatsdatei beheben:

$ cd /opt/local/etc/openssl[.____.($ Sudo curl -O http://curl.haxx.se/ca/cacert.pem[.____.($ Sudo mv cacert.pem cert.pem 

Ich hatte kein Problem mit Ruby 1.9.2. Warum habe ich das Problem "Zertifikatüberprüfung fehlgeschlagen" für Ruby 1.9.3 erhalten? Ist das ein Ruby 1.9.3-Fehler? Ist es spezifisch für Mac OS 10.6.8? Ist meine Lösung der richtige Weg, um dieses Problem zu lösen?

18
Daniel Kehoe

An der richtigen Antwort sind viele bewegliche Teile beteiligt. Abhängig von Ihrem Betriebssystem, Ruby-Version, OpenSSL-Version, Rubygems-Version. Am Ende habe ich einen Artikel geschrieben, nachdem ich ihn recherchiert hatte. In meinem Artikel werden die Gründe für den Fehler erläutert, Schritte zur weiteren Diagnose beschrieben, mehrere Problemumgehungen beschrieben und Lösungsvorschläge gemacht. Das wird hilfreich sein:

OpenSSL-Fehler und Rails - Zertifikatprüfung fehlgeschlagen

Es gibt auch Links zu den relevanten Commits und Ausgaben auf GitHub.

21
Daniel Kehoe

Bei mir ist dies auf OS X mit Homebrew aufgetreten, nachdem auf die neueste RVM (rvm 1.20.12) aktualisiert wurde und anschließend Ruby-1.9.3-p429 installiert wurde. Ich konnte das Problem einfach reproduzieren, indem ich Folgendes ausführte:

$ 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 > 

Die Lösung war ähnlich wie in der Frage, aber der Weg war falsch. Durch das Ausführen dieses Problems wurde es behoben:

curl https://curl.haxx.se/ca/cacert.pem -o /usr/local/etc/openssl/cert.pem

Der Hinweis auf den richtigen Pfad war, dass bei der Installation von Ruby-1.9.3-p429 über RVM dies in der Ausgabe angezeigt wurde:

Certificates in '/usr/local/etc/openssl/cert.pem' already are up to date.

Ich hatte den /usr/local/etc/openssl-Pfad, aber keine cert.pem-Datei in diesem Verzeichnis. Daher bin ich nicht sicher, warum RVM behauptete, die Zertifikate seien auf dem neuesten Stand. Es wäre schön zu wissen, warum ich das an erster Stelle machen musste, aber ich habe jetzt keine Zeit, das zu untersuchen.

13
Liron Yahdav

Ich hatte das gleiche Problem, nachdem ich meine RVM Ruby gegen eine RVM-Installation von OpenSSL kompiliert hatte. Ich habe die Datei cacerts.pem so verschoben, wie sie vom Originalposter unter ~/.rvm/usr/ssl/cert.pem heruntergeladen wurde, damit das Problem behoben wird. 

11
Sander Temme

Ich hatte das gleiche Problem.

Wie ich es endlich behoben habe, war die Aktualisierung meiner OpenSSL-Version, die ich über MacPorts installiert hatte. Ich habe eine OpenSSL-Version von 2009 ausgeführt, also habe ich meine MacPorts-Installation und dann meine OpenSSL-Installation über die ports-Befehlszeilenschnittstelle aktualisiert, und der Fehler ist verschwunden.

Es muss selbstverständlich eine gewisse Integration zwischen Ruby/Rails und OpenSSL auf Mac-basierten Installationen vorhanden sein. In meinem Fall hatte ich Probleme mit dem Login bei Facebook , um ordnungsgemäß zu funktionieren, wenn Facebook das oAuth/Login-Token an meine App zurücksendete. Devise & OmniAuth brauchte ein gültiges SSL-Zertifikat für graph.facebook.com, das nicht vorhanden war meine alte Version von OpenSSL.

2
Robert Brown

Das OpenSL-Zertifizierungsverzeichnis ist /usr/lib/ssl/ in Debian. Also, drei Zeilen genügen war genug für mich,

$ cd /usr/lib/ssl/
$ Sudo curl -O http://curl.haxx.se/ca/cacert.pem
$ Sudo mv cacert.pem cert.pem
1
seyyah

Möglicherweise liegt es daran, wie Sie 1.9.2 und 1.9.3 erstellt haben - vielleicht ist das Tool, mit dem Sie die konfigurierten Dinge erstellt haben, ein wenig anders. Oder sie verwenden möglicherweise andere Versionen von OpenSSL.

Hier ist die einzige potenziell relevante Änderung, die ich im Netz feststellen konnte: HTTP zwischen 1.9.2 und 1.9.3

 require 'net/protocol'
-autoload :OpenSSL, 'openssl'
 require 'uri'
+autoload :OpenSSL, 'openssl'

(wenn Sie den Unterschied sehen wollen ...)

 git clone https://github.com/Ruby/ruby.git[.____.(cd Ruby 
 git diff Origin/Ruby_1_9_2 Origin/Ruby_1_9_3 - http.rb 
0
John Bachir

Ich hatte ein ähnliches Problem, aber nicht bei Rails, sondern nur bei Ruby unter Windows. Ich habe das Problem gelöst, indem Sie das Zertifikat cacert.pem verwenden und den Speicherort des Zertifikats auf die Umgebungsvariable "SSL_CERT_FILE" setzen.

Ausführliche Antwort hier: https://stackoverflow.com/a/35429863/4747587

0
Henry