2015-01-06 20 views
5

Ho appena iniziato a imparare Ruby e, dopo alcune operazioni di base, sto cercando di capire come effettuare chiamate REST a un servizio in ruby. Posso fare richieste di ottenere l'API di foursquare senza problemi. D'altra parte le chiamate all'API Cisco CMX danno errore. La mia versione rubino è 2.1.2. Ho cercato molte soluzioni sul web ma ho ancora problemi. Questo comando della mia shell viene eseguito.Errore SSLE: nome host "W.X.Y.Z" non corrisponde al certificato del server

Lavorare Uno

$resclient 
>> RestClient.get 'https://api.foursquare.com/v2/venues/search?ll=40.7,-74&oauth_token=0ZDO1JMJ0PW2QTCDK50OGZ21UENHZ0Y3KIDQZJLLURTQNRQ2&v=20150106' 

Questo dà errore

$restclient 
>> RestClient.get 'https://learning:[email protected]/api/contextaware/v1/maps/.json' 

mio log degli errori:

OpenSSL::SSL::SSLError: hostname "64.103.26.61" does not match the server certificate 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/2.1.0/openssl/ssl.rb:139:in `post_connection_check' 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/2.1.0/net/http.rb:922:in `connect' 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/2.1.0/net/http.rb:863:in `do_start' 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/2.1.0/net/http.rb:852:in `start' 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rest-client-1.7.2/lib/restclient/request.rb:413:in `transmit' 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rest-client-1.7.2/lib/restclient/request.rb:176:in `execute' 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rest-client-1.7.2/lib/restclient/request.rb:41:in `execute' 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rest-client-1.7.2/lib/restclient.rb:65:in `get' 
from (irb):3 
from /Users/apple/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rest-client-1.7.2/bin/restclient:93:in `<top (required)>' 
from /Users/apple/.rbenv/versions/2.1.2/bin/restclient:23:in `load' 
from /Users/apple/.rbenv/versions/2.1.2/bin/restclient:23:in `<main>' 

la prego di dare qualche consiglio? Grazie

risposta

8

Could you please give some advise?

Ecco una risposta più dettagliata e come risolvere il problema in Ruby con qualcosa di diverso il patetico OpenSSL::SSL::VERIFY_NONE.

$ openssl s_client -connect 64.103.26.61:443 | openssl x509 -text -noout 
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2 
... 
     Subject: C=US, ST=CA, L=San Jose, O=Cisco Systems, Inc., CN=msesandbox.cisco.com 
... 
      X509v3 Subject Alternative Name: 
       DNS:msesandbox.cisco.com 

Quindi l'appliance ha un nome DNS msesandbox.cisco.com. nslookup ti dice la sua una buona hostname:

$ nslookup msesandbox.cisco.com 
Server:  192.168.1.1 
Address: 192.168.1.1#53 

Non-authoritative answer: 
Name: msesandbox.cisco.com 
Address: 64.103.26.61 

Quindi la prima cosa che dovete fare è connettersi ad esso con il suo nome DNS, e non un indirizzo IP.

Se si emette i certificati per il dominio cisco.com (o può fare una richiesta), allora si può chiedere che l'indirizzo IP 64.103.26.61 essere aggiunto come nome soggetto alternativo (SAN). Quindi ci saranno due SAN nel certificato.


Ora, se si va di nuovo al comando openssl:

$ openssl s_client -connect 64.103.26.61:443 | openssl x509 -text -noout 
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2 
verify error:num=19:self signed certificate in certificate chain 
... 
    Issuer: C=US, O=HydrantID (Avalanche Cloud Corporation), CN=HydrantID SSL ICA G2 
... 
    Subject: C=US, ST=CA, L=San Jose, O=Cisco Systems, Inc., CN=msesandbox.cisco.com 

Si vedrà l'emittente e soggetto sono diversi. Ciò significa che questo è non un certificato autofirmato. Il certificato è stato emesso da HydrantID (Avalanche Cloud Corporation).

Se si guarda oltre, si vedrà la chiave pubblica del dell'Emittente (Authority Key Identifier) ​​è diversa da quella chiave pubblica del Soggetto (Subject Key Identifier):

X509v3 Authority Key Identifier: 
    keyid:98:6A:B6:2D:2E:BF:A7:AA:9F:F6:F7:D6:09:AF:D5:8B:57:F9:8A:B7 
... 
X509v3 Subject Key Identifier: 
    B5:3D:50:53:0A:A2:06:9E:9A:29:89:7A:AB:96:90:FE:9D:6B:57:A0 

Anche in questo caso, non è auto firmato.


Se si torna al comando OpenSSL ancora una volta, si vedrà l'emittente è HydrantID SSL ICA G2, e la sua emittente è QuoVadis Root CA2 G3:

depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2 
verify return:1 
depth=1 C = US, O = HydrantID (Avalanche Cloud Corporation), CN = HydrantID SSL ICA G2 
verify return:1 
depth=0 C = US, ST = CA, L = San Jose, O = "Cisco Systems, Inc.", CN = msesandbox.cisco.com 
verify return:1 

Ciò significa QuoVadis Root CA2 G3 emesso HydrantID SSL ICA G2; e HydrantID SSL ICA G2 rilasciato msesandbox.cisco.com. QuoVadis Root CA2 G3 è il top della catena alimentare.

È possibile recuperare QuoVadis Root CA2 G3 da QuoVadis CA Certificate Download:

$ curl -O -J -L https://www.quovadisglobal.bm/Repository/~/media/Files/Roots/quovadis_rca2g3_der.ashx 
    % Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
100 1380 100 1380 0  0 1808  0 --:--:-- --:--:-- --:--:-- 5726 
curl: Saved to filename 'quovadis_rca2g3_der.cer' 

$ openssl x509 -in quovadis_rca2g3_der.cer -inform DER -out quovadis-ca.pem -outform PEM 
$ cat quovadis-ca.pem 
-----BEGIN CERTIFICATE----- 
MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL 
BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc 
BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 
... 
-----END CERTIFICATE----- 

SE vi fidate QuoVadis per certificare l'apparecchio, quindi:

$ openssl s_client -connect msesandbox.cisco.com:443 -CAfile quovadis-ca.pem 
CONNECTED(00000003) 
depth=2 C = BM, O = QuoVadis Limited, CN = QuoVadis Root CA 2 
verify return:1 
depth=1 C = US, O = HydrantID (Avalanche Cloud Corporation), CN = HydrantID SSL ICA G2 
verify return:1 
depth=0 C = US, ST = CA, L = San Jose, O = "Cisco Systems, Inc.", CN = msesandbox.cisco.com 
verify return:1 
... 

    Start Time: 1420616960 
    Timeout : 300 (sec) 
    Verify return code: 0 (ok) 

Avviso OpenSSL finito con Verify return code: 0 (ok). Questo ti dice che hai una buona catena. OpenSSL non esegue la corrispondenza del nome host, ma sappiamo già che il nome host nel certificato è buono.


Ora, per codice Ruby. Tutto quello che dovete fare è collegare il CA in Rubino:

#!/usr/bin/ruby 

require 'net/http' 
require 'net/https' 
require 'openssl' 

uri = URI('https://msesandbox.cisco.com:443') 

options_mask = OpenSSL::SSL::OP_NO_SSLv2 | OpenSSL::SSL::OP_NO_SSLv3 | OpenSSL::SSL::OP_NO_COMPRESSION 

http = Net::HTTP.new(uri.host, uri.port) 
request = Net::HTTP::Get.new(uri.request_uri) 

if uri.scheme == "https" 
    http.use_ssl = true 
    http.verify_mode = OpenSSL::SSL::VERIFY_PEER 
    http.ca_file = File.join(File.dirname(__FILE__), "quovadis-ca.pem") 
    # http.ssl_options = options_mask 
end 

response = http.request request 

Ed ecco una corsa:

$ ./Connect-Test.rb 
$ 

Nessuna eccezione, e non OpenSSL::SSL::VERIFY_NONE.

Si dovrebbe provare a utilizzare options_mask poiché rimuove i protocolli deboli/feriti/rotti. Ma Ruby è così rotto e non documentato a volte, non sono mai riuscito a farlo funzionare.


sono stato in grado di radicare la fiducia sia in HydrantID SSL ICA G2 e QuoVadis Root CA2 G3 con OpenSSL (che significa ho ottenuto un Verify Result 0 (OK) da OpenSSL). Ma Ruby poteva gestire solo (non era possibile creare una catena su HydrantID SSL ICA G2). Più rotture rubino.

+0

Grazie per la tua risposta dettagliata. Ora capisco il problema. Sembra che questo certificato autofirmato non sia adatto per il mio localhost.Ho installato un gioiello chiamato certificato che gestisce questo problema (non so come funziona) Ho rimosso OpenSSL :: SSL :: VERIFY_NONE dal mio codice. Come hai detto, per la produzione ho intenzione di scaricare il certificato dal download del certificato CA di QuoVadis –

1

Se andate al vostro Host con un browser, come

> https://64.103.26.61/ 

si vedrà si otterrà lo stesso errore. Il certificato su questo server non è valido, in quanto il server risponde su un altro nome host diverso da quello scritto nel certificato.

È possibile cercare una descrizione più complessa se si immette l'indirizzo del server su Digicert Helpcenter. Il certificato è stato rilasciato a msesandbox.cisco.com. Se questo è l'indirizzo che stai cercando di raggiungere, usa questo al posto dell'IP. Se questo è il tuo server, cambia il nome della risposta

+0

Sfortunatamente, non è mio. –

+0

Quindi, prova a configurare la tua connessione tramite RestClient.get 'https: // learning: [email protected]/api/contextaware/v1/maps/.json' o prova a contattare l'amministratore – chenino

+0

Grazie amico, problema risolto. Ho postato il codice –

-3

Ok ho trovato la soluzione. Ho appena aggiunto il codice qui sotto e tutto è stato risolto. Penso che il problema sia il server Cisco.

:verify_ssl => OpenSSL::SSL::VERIFY_NONE 
+2

No, non è una soluzione. * Potrebbe * essere parte di una soluzione, come [Public Key Pinning] (http://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning). Ma come misura a sé stante, la sua soluzione non è affatto. – jww