2015-11-06 5 views
11

Le varianti di questo errore sono state pubblicate in tutto il sito ma nessuna delle soluzioni sembra funzionare per me.Ruby: SSL_connect SYSCALL restituito = 5 errno = 0 stato = stato sconosciuto (OpenSSL :: SSL :: SSLError)

Sono in esecuzione ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux] e OpenSSL 1.0.1k 8 Jan 2015.

eseguendo il seguente:

require 'net/http' 
require 'openssl' 

url = 'https://ntpnow.com/' 
uri = URI.parse(url) 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.ssl_version = :TLSv1 
http.get(uri.path) 

Discariche questa traccia:

/usr/local/lib/ruby/2.2.0/net/http.rb:923:in `connect': SSL_connect SYSCALL returned=5 errno=0 state=unknown state (OpenSSL::SSL::SSLError) 
    from /usr/local/lib/ruby/2.2.0/net/http.rb:923:in `block in connect' 
    from /usr/local/lib/ruby/2.2.0/timeout.rb:74:in `timeout' 
    from /usr/local/lib/ruby/2.2.0/net/http.rb:923:in `connect' 
    from /usr/local/lib/ruby/2.2.0/net/http.rb:863:in `do_start' 
    from /usr/local/lib/ruby/2.2.0/net/http.rb:852:in `start' 
    from /usr/local/lib/ruby/2.2.0/net/http.rb:1375:in `request' 
    from /usr/local/lib/ruby/2.2.0/net/http.rb:1133:in `get' 
    from bin/ntpnow_test.rb:9:in `<main>' 

Navigazione al sito da un browser mostra il certificato sembra andare bene. Anche Curl non produce errori.

Inoltre, quando provo con Ruby 1.9.3 sembra funzionare. Tuttavia, non sono propenso a eseguire il downgrade delle versioni di Ruby se riesco a trovare una soluzione.

Potete dirmi, per favore, che cosa esattamente ha causato questo problema?

UPDATE:

risposta e la spiegazione di sotto di Steffen è corretto. Per riferimento futuro, ecco come diagnosticare questo problema.

  1. Determinare innanzitutto quali crittografie il server supporta. Esegui il comando nmap --script ssl-enum-ciphers ntpnow.com. Trova la sezione che elenca le cifre supportate.
  2. Determinare la chiave di crittografia da passare come parte di http.ciphers. Esegui openssl ciphers. Questo sputerà un elenco di cifrature delimitato da :. Trova quello che corrisponde al risultato del passaggio 1.

risposta

7

Questo sembra esattamente lo stesso problema che ho risposto in https://stackoverflow.com/a/29611892/3081018. Lo stesso problema: il server può solo eseguire TLS 1.0 e supporta solo DES-CBC3-SHA come crittografia. Questo codice non è più abilitato di default nelle recenti versioni di ruby. Per connetterti con questa cifra cercare di indicare la cifra in modo esplicito nel codice:

http.ssl_version = :TLSv1 
http.ciphers = ['DES-CBC3-SHA'] 
+0

Eccellente! Questo ha funzionato. L'unica differenza è che ho dovuto usare DES-CBC3-SHA come codice. Grazie mille! – prajo

+0

@prajo: ho cambiato la risposta per usare il codice corretto. –

3

Io uso Mechanize, ed ero alla ricerca di una patch invece di una configurazione dell'istanza client HTTP. Ecco come sono riuscito a farlo:

OpenSSL::SSL::SSLContext::DEFAULT_PARAMS[:ciphers] += ':DES-CBC3-SHA'