2011-11-01 18 views
22

considere el siguiente código:Cómo conectarse a un servidor HTTPS con un certificado no válido utilizando las últimas versiones de Ruby

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) 

donde https://host/index.html es una dirección válida con un certificado no válido en el servidor.

En versiones anteriores de ruby ​​(específicamente 1.8.7-p334 y 1.9.2-p180) este código funciona bien. En todas las versiones recientes (1.8.7-P352, P290-1.9.2 y 1.9.3-P0) que arroja la siguiente excepción:

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

en la última línea.

Al cambiar el valor de verify_mode a OpenSSL::SSL::VERIFY_PEER aparece exactamente el error que sugiere que se está intentando verificar el certificado a pesar de la configuración.

¿Cómo puedo convencer a ruby ​​para que ignore el certificado inválido y se conecte?

Respuesta

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

Uso de '# start' en lugar de' # post_form' con la propiedad modo de verificar solucionado el problema para mí también. Parece extraño ... Gracias por la sugerencia. –

+0

¿Por qué tienes que usar el método de inicio? – jspooner

+1

Tuve que agregar 'requerir' net/https "', antes solo tenía '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

En ruby ​​2.2.2 'open (my_url,: ssl_verify_mode => OpenSSL :: SSL :: VERIFY_NONE)' es suficiente – mrt

Cuestiones relacionadas