2009-07-11 26 views
41

Intento acceder a un archivo con open-uri a través de una conexión https. Lamentablemente, algunas cosas mal con el certificado, obtengo un certificado que verifica el error. No puedo hacer nada al respecto, así que tengo que pasar por alto la verificación.¿Cómo pasar por alto la verificación del certificado SSL en open-uri?

yo encontramos este answer

Yo no quiero/no se puede cambiar el oen-uri.rb en el servidor, y yo estoy corriendo de Ruby 1.8.6.

¿Cómo cambio el modo de verificación? O más exactamente ¿dónde lo cambio?

¿Dónde puedo poner esto?

if target.class == URI::HTTPS 
require 'net/https' 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
store = OpenSSL::X509::Store.new 
store.set_default_paths 
http.cert_store = store 
end 

o el sucio hack: ¿dónde puedo poner esto?

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE 

Respuesta

59

Si realmente no desea la seguridad adicional del uso de la verificación del certificado, y puede actualizar a Ruby 1.9.3p327 +, se puede pasar la opción ssl_verify_mode al método open. Aquí, por ejemplo, es la forma en que lo estoy haciendo:

request_uri=URI.parse('myuri?that_has=params&encoded=in_it&optionally=1') 

# The params incidentally are available as a String, via request_uri.query 
output = open(request_uri, {ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE}) 
obj = JSON.parse output.readlines.join("") 
+0

@JimmyDean 2.2.1p85 en mac os x aquí, verify_mode no funciona. – nurettin

+0

@nurettin - Estás 100% correcto. Estaba mirando la gema equivocada. HTTPClient es verify_mode. He eliminado por comentario para no desordenar con información incorrecta. Gracias por señalar esto. http://www.rubydoc.info/gems/httpclient/HTTPClient%2FSSLConfig%3Averify_mode – JamesDeHart

+1

@JimmyDean gracias por arreglar – nurettin

38

Lo he descubierto ahora mismo: he usado el truco sucio, que funciona bien para mí.

tuve que ponerla en: yourrailsapp/initalizers/

No he creado un bypass_ssl_verification_for_open_uri.rb

y poner:

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE 
+8

Si obtiene un error de "asignación de constante dinámica" haga lo siguiente: OpenSSL :: SSL.const_set (: VERIFY_PEER, OpenSSL :: SSL :: VERIFY_NONE) – Sam

+3

Y para evitar incluso la 'advertencia: constante ya inicializada OpenSSL :: SSL :: VERIFY_PEER' advertencia, use 'remove_const' para eliminar primero la constante antes de volver a agregarla. Esto es difícil de escribir en un comentario por lo que [consulte esta idea en su lugar] (https://gist.github.com/siruguri/66926b42a0c70ef7119e). – sameers

+0

Prefiero respuestas de @sameers si está usando ruby ​​1.9.3p327 + – jvenezia

1

parece ser un buen candidato para su inclusión en environment.rb, o si esta el pirateo solo es necesario en entornos particulares, luego en sus archivos de configuración individuales.

13

es bueno (que puede generar uninitialized constant OpenSSL (NameError)) para poner require 'openssl' antes de esa línea, por lo

app/config/inicializadores/bypass_ssl_verification_for_open_uri.rb (nombre del archivo de inicialización doesn' materia)

require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

+3

¿Cómo puedo usarlo en un script? Lo he intentado y recibí una 'advertencia: ya se ha inicializado la constante VERIFY_PEER'. y no funciona – daitangio

+0

parece que esa constante VERIFY_PEER ya está definida en algún lugar antes, ¿se obtiene un error de verificación? –

3

Una forma débil, pero es controlado

class XMLRPC::Client 
# WEAK: Enrich the Client with a method for disabling SSL VERIFICATION 
# See /usr/lib/ruby/1.9.1/xmlrpc/client.rb:324 
# Bad hack but it works 
def disableSSLVerification 
    @http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
    warn "Proxyman SSL Verification disabled" 
end 
end 

Entonces sólo tiene que llamar

client.disableSSLVerification() 
9

Como usted ha mencionado a sí mismo, esto es un truco sucio . Obviamente, deshabilitar la verificación del certificado SSL no es una buena idea.

Hay una muy útil article de Mislav Marohnić, que explica detalladamente por qué esto es malo y cómo abordarlo correctamente.

En resumen, que en su mayoría obtener el SSL verificar error si:

  1. el certificado es válido, pero el sistema no tiene el certificado raíz necesaria para la verificación.
  2. el certificado está auto-firmado, p. en su empresa y hay que confiar en que
  3. que está sujeto a una man-in-the-middle

Para mí el primer caso se aplica, y simplemente actualizar el paquete ca-certificados en mi sistema Ubuntu hizo el truco.

Una gran herramienta para rastrear su error SSL es el ssl doctor script.

3

Es su llamada, pero establecer VERIFY_PEER en NINGUNO es básicamente equivalente a para deshabilitar TLS por completo y conectar texto plano HTTP. Hace que el hombre en el medio ataque trivial, y no pasará una auditoría PCI.

Cuestiones relacionadas