2012-02-07 11 views
12

Ho un ambiente di prova che utilizza Ruby per guidare un server su una connessione https. Poiché le ultime versioni di Ruby rifiutano di connettersi a un server https con un certificato non valido (vedere this earlier question of mine) e vorrei iniziare a utilizzare una versione più recente di Ruby, sto tentando di impostare un certificato valido.Connessione tramite https a un server con un certificato firmato da una CA Ho creato

Ho creato un certificato CA da utilizzare (ci sono più server in fase di test, quindi questo sembra il modo più semplice), e l'ho usato con successo per firmare un nuovo certificato che è stato installato su un server e viene utilizzato. Ho aggiunto il certificato CA all'archivio del browser e questo (il browser) ora si connetterà al server senza reclami. Quindi sono sicuro che i miei certificati siano validi e impostati correttamente.

So che Ruby non utilizza lo stesso negozio del browser. Ho utilizzato il file CA disponibile here per testare la connessione ad altri server (pubblici) (impostato utilizzando il metodo Net::HTTP#ca_file=) e anche questo funziona.

Quello che non riesco a far funzionare è Ruby che si connette al mio server usando il mio certificato. Ho provato vari modi di puntandolo verso il mio certificato (tra cui aggiungendo il mio certificato nel file linkato sopra) e si dà sempre lo stesso errore:

SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A (OpenSSL::SSL::SSLError) 

Che cosa devo fare per convincere Rubino ad accettare il mio certificato e connettersi al mio server?

Il codice che sto usando è:

require 'net/https' 

uri = URI.parse("https://hostname/index.html") 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_PEER 
http.ca_file = "My CA cert file" 
request = Net::HTTP::Get.new(uri.path) 
response = http.request(request) 

Sto assumendo questo è sbagliato in qualche modo. Quello che voglio sapere è, cosa dovrei fare per usare il mio certificato CA?

+0

Hai detto di eseguire il server anche con Ruby? Potresti per favore postare gli snippet di codice rilevanti per client e server? – emboss

+0

@emboss il server non è Ruby (in realtà è tomcat anche se non credo che importi). Non sono sicuro del codice che vorresti vedere. Sto solo usando la libreria standard https di Ruby. – Jonathan

+0

@Jonathan, incollare il codice client che si sta utilizzando per connettersi al proprio server sarebbe un punto di partenza. –

risposta

20

Suppongo che al Tomcat non piaccia la versione del protocollo che Ruby tenta di negoziare. Ruby utilizza SSLv23 per impostazione predefinita, ma ho sentito altri casi in cui questo era un problema per i server Web basati su Java. Il messaggio di errore che stai ricevendo indica che l'handshake ha esito negativo durante l'impostazione della connessione e tenta di leggere la risposta del server. Prova ad aggiungere o

http.ssl_version = :TLSv1 

o

http.ssl_version = :SSLv3 

e vedere se funziona già.

Se ciò non risolve il problema, sarebbe molto interessante vedere perché il server rifiuta il tentativo di connessione. Prova a eseguire Tomcat con -Djavax.net.debug=ssl e pubblica le parti pertinenti (informazioni sulla connessione, stacktrace delle eccezioni) sul motivo per cui il tentativo fallisce.

+0

Funziona! Grazie mille. Sapevo che doveva essere qualcosa di semplice che mi mancava! – Jonathan

+0

Prego! In realtà, potresti anche aiutarmi. Devo capire se questo è un vero bug sul lato Java. Usare SSLv23 sul lato client è come dire al server "Posso fare qualsiasi protocollo tu voglia, solo nominarlo", così Tomcat non avrebbe dovuto rifiutare in primo luogo. Quale versione esatta di Tomcat stai usando, quale JDK? – emboss

+0

Per motivi di interesse, se vi è capitato di sapere, questo valore è stato modificato di recente? Questo problema si verifica solo con le ultime versioni (1.8.7-p352 e 1.9.2p290). Le versioni precedenti vanno bene. – Jonathan

0

Assicurarsi che il file del certificato sia in formato PEM, non in CRT (quindi il documentation for Net::HTTP in Ruby 1.9.3 dice).

Aggiornamento sembra che la documentazione non sia aggiornata, Ruby 1.9.3 accetterà qualsiasi tipo di certificato.

+0

Non importa. Ruby può gestire file di certificati PEM (in bundle) e certificati con codifica DER. Questa è una delle sue funzioni convenienti in realtà, non è necessario preoccuparsi del formato dei certificati. – emboss

+0

La documentazione dice altrimenti http://www.ruby-doc.org/stdlib-1.9.3/libdoc/net/http/rdoc/Net/HTTP.html#attribute-i-ca_file ma io ti crederò, non ho mai provato con certificati non PEM. – gioele

+0

Oops, mi dispiace, quindi ho bisogno di aggiornare la documentazione :) Il mio male, puoi fare una micro modifica, in modo che io possa prendere il downvote di distanza? – emboss

2

Sto usando Ruby 1.9.3 e ho riscontrato lo stesso errore durante l'utilizzo di nokogiri per analizzare alcuni URL sicuri.

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: (null) 

La risposta sopra fornita da rilievo è corretta ma assicurarsi che l'errore SSL generato è questa che è menzionato sopra.Ho seguito lo stesso e ho trovato una soluzione come questa menzionata di seguito.

uri = URI(url) 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.ssl_version = :SSLv3 
http.verify_mode = OpenSSL::SSL::VERIFY_PEER 
response = http.get(url) 

ora la risposta è avere la corretta html analizzato per l'URL protetto che viene passato ai codici nella URL.

Problemi correlati