2011-11-01 9 views
22

Si consideri il seguente codice:Come connettersi a un server HTTPS con un certificato non valido utilizzando le ultime versioni di Rubino

require 'net/https' 
uri = URI.parse("https://host/index.html") 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
request = Net::HTTP::Get.new(uri.path) 
response = http.request(request) 

dove https://host/index.html è un indirizzo valido, con un certificato non valido sul server.

Nelle versioni precedenti di ruby ​​(in particolare 1.8.7-p334 e 1.9.2-p180) questo codice funziona correttamente. Su tutte le versioni più recenti (1.8.7-P352, P290 1.9.2-e 1.9.3-P0) viene generata la seguente eccezione:

OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=unknown state 

sull'ultima riga.

La modifica di verify_mode su OpenSSL::SSL::VERIFY_PEER fornisce esattamente l'errore che indica che sta tentando di verificare il certificato nonostante l'impostazione.

Come posso convincere Ruby a ignorare il certificato non valido e connettersi?

risposta

19
uri = URI("https://host/index.html") 
req = Net::HTTP::Get.new(uri.path) 

res = Net::HTTP.start(
     uri.host, uri.port, 
     :use_ssl => uri.scheme == 'https', 
     :verify_mode => OpenSSL::SSL::VERIFY_NONE) do |https| 
    https.request(req) 
end 
+0

Utilizzando '# start' invece di' # post_form' con la proprietà modalità di verifica risolto il problema anche per me. Sembra strano ... Grazie per il suggerimento. –

+0

Perché devi usare il metodo di avvio? – jspooner

+1

Ho dovuto aggiungere 'require" net/https "', prima avevo solo 'require" net/http "' – botchniaque

9
require 'nokogiri' 
require 'open-uri' 
require 'net/https' 

@doc = Nokogiri::HTML(open(my_url, :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE)) 
+0

In ruby ​​2.2.2 'open (my_url,: ssl_verify_mode => OpenSSL :: SSL :: VERIFY_NONE)' è abbastanza – mrt

Problemi correlati