2009-07-11 2 views
41

Ich versuche, eine Datei mit Open-URI über eine HTTPS-Verbindung zuzugreifen. Leider etwas mit dem Zertifikat falsch, bekomme ich eine Zertifikat überprüfen fehlgeschlagen Fehler. Ich kann nichts dagegen tun, also muss ich die Überprüfung umgehen.Wie umgehen Sie SSL-Zertifikat Verifikation in Open-URI?

Ich fand diese answer

Ich will nicht auf dem Server/kann nicht den oen-uri.rb ändern, und ich bin mit Ruby-1.8.6.

Wie ändere ich den Verifizierungsmodus? Oder genauer, wo ändere ich es?

Wo kann ich das hinstellen?

if target.class == URI::HTTPS 
require 'net/https' 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
store = OpenSSL::X509::Store.new 
store.set_default_paths 
http.cert_store = store 
end 

oder der schmutzige hack: wo kann ich das setzen?

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE 

Antwort

59

Wenn Sie wirklich Zertifikatsüberprüfung nicht die zusätzliche Sicherheit verwenden möchten, und Ruby 1.9.3p327 + aktualisieren können, können Sie die ssl_verify_mode Option zum open Methode übergeben. Hier zum Beispiel ist, wie ich es so mache:

request_uri=URI.parse('myuri?that_has=params&encoded=in_it&optionally=1') 

# The params incidentally are available as a String, via request_uri.query 
output = open(request_uri, {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE}) 
obj = JSON.parse output.readlines.join("") 
+0

@JimmyDean 2.2.1p85 auf Mac OS x hier, verify_mode funktioniert nicht. – nurettin

+0

@nurettin - Sie sind 100% richtig. Ich schaute auf das falsche Juwel. HTTPClient ist verify_mode. Ich habe per Kommentar entfernt, um nicht mit falschen Informationen zu durcheinander zu kommen. Danke, dass du darauf hingewiesen hast. http://www.rubydoc.info/gems/httpclient/HTTPClient%2FSSLConfig%3Averify_mode – JamesDeHart

+1

@JimmyDean danke für die Befestigung – nurettin

38

Ich habe es jetzt selbst herausgefunden: Ich habe den dreckigen Hack benutzt, der für mich funktioniert.

hatte ich es in setzen: yourrailsapp/initalizers/

Dort schuf ich ein bypass_ssl_verification_for_open_uri.rb

Und setzen:

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE 
+8

Wenn Sie eine 'dynamische Konstante Zuweisung' Fehler erhalten, gehen Sie folgendermaßen vor: OpenSSL :: SSL.const_set (: VERIFY_PEER, OpenSSL :: SSL :: VERIFY_NONE) – Sam

+3

Und um zu vermeiden, auch die 'Warnung: bereits initialisierte Konstante OpenSSL :: SSL :: VERIFY_PEER Warnung, benutze 'remove_const', um zuerst die Konstante zu entfernen, bevor du sie wieder hinzufügst. Das ist schwer in einen Kommentar zu schreiben. [Check out this gist stattdessen] (https://gist.github.com/siruguri/66926b42a0c70ef7119e). – sameers

+0

Bevorzugen @samees antworten, wenn Sie mit Ruby 1.9.3p327 + – jvenezia

1

Es scheint ein guter Kandidat für die Aufnahme in environment.rb, oder wenn dies Hack ist nur in bestimmten Umgebungen notwendig, dann in ihren individuellen Konfigurationsdateien.

13

es ist gut (es uninitialized constant OpenSSL (NameError) laichen) zu setzen require 'openssl' vor dieser Linie, so

app/config/initializers/bypass_ssl_verification_for_open_uri.rb (Dateiname von initializer doesn‘Materie)

require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

+3

Wie kann ich es für ein Skript verwenden? Ich habe es versucht und ich habe 'Warnung: bereits initialisiert konstant VERIFY_PEER.' und es funktioniert nicht – daitangio

+0

es scheint, dass Konstante VERIFY_PEER bereits irgendwo definiert ist, erhalten Sie Certify Verification Error? –

3

eine schwache, aber kontrollierte Weise ist

class XMLRPC::Client 
# WEAK: Enrich the Client with a method for disabling SSL VERIFICATION 
# See /usr/lib/ruby/1.9.1/xmlrpc/client.rb:324 
# Bad hack but it works 
def disableSSLVerification 
    @http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
    warn "Proxyman SSL Verification disabled" 
end 
end 

Dann rufen Sie einfach

client.disableSSLVerification() 
9

Wie Sie selbst erwähnten, ist dies ein schmutziger Hack. Offensichtlich ist das Deaktivieren der Überprüfung von SSL-Zertifikaten keine gute Idee.

Es gibt eine sehr hilfreiche article von Mislav Marohnić, die sehr detailliert beschreibt, warum das schlecht ist und wie man das richtig angeht.

Zusammengefasst erhalten Sie meist die SSL-Fehler überprüfen, ob:

  1. das Zertifikat gültig ist, aber Ihr System nicht über das notwendige Stammzertifikat für die Prüfung.
  2. Das Zertifikat ist selbstsigniert, z. in Ihrem Unternehmen und müssen Sie es
  3. Sie sind unter einem Man-in-the-Middle-Angriff

Für mich ist der erste Fall angewandt, und einfach die Aktualisierung des CA-Zertifikate Paket auf Vertrauen mein Ubuntu-System hat es geschafft.

Ein großartiges Tool zum Aufspüren Ihres SSL-Fehlers ist der ssl doctor script.

3

Es ist Ihr Anruf, aber die Einstellung von VERIFY_PEER auf NONE ist grundsätzlich äquivalent zu deaktivieren TLS insgesamt und die Verbindung über Klartext HTTP. Es macht Mann in der Mitte Angriffe trivial, und wird kein PCI-Audit bestehen.