Este post casi duplica un número de otros puestos, como Rails 4 y Ruby 2 Net/HTTP SSL Solicitud: OpenSSL::SSL::SSLError: SSL_connect devuelto=1 errno=0 estado=SSLv2/v3 leer servidor hola Una: protocolo desconocido y SSL_connect devuelto=1 errno=0 estado=SSLv3 leer certificado de servidor B: certificado de comprobar error, pero con una diferencia clave: el «certificado de comprobar error de» error sólo ocurre cuando proxy a través de un servidor proxy SSL (Charles), y sólo en la última versión de Ruby.

Específicamente, este (sin proxy) código funciona:

  uri = URI.parse('https://www.ibm.com')
  http = Net::HTTP.new(uri.host, uri.port, nil)
  http.use_ssl = true
  http.start { |agent| agent.get(uri.path) }

y este (proxy) código de falla con un «certificado de verificar el error» error:

  uri = URI.parse('https://www.ibm.com')
  http = Net::HTTP.new(uri.host, uri.port, "localhost", 8888)
  http.use_ssl = true
  http.start { |agent| agent.get(uri.path) }

el rompecabezas

El error SÓLO aparece cuando se va a través de un proxy en las versiones actuales de Ruby/OpenSSL. En particular:

  • Hay ningún error cuando NO pasa por el servidor proxy, lo que me lleva a pensar que el local de certificados son válidos.
  • No hay error cuando se va a través de un proxy con Firefox o curl -v https://www.ibm.com/, lo que me lleva a pensar que el Charles de certificados son válidos.
  • Hay ningún error de ir a través de un proxy en una versión anterior de Ruby /OpenSSL (ver más abajo para los dos ambientes).

Todo esto me hace sospechar de un real Ruby error en lugar de un problema con mi certs, pero yo estaría feliz de ser demostrado lo contrario.

el entorno actual

Estoy observando el error con este entorno:

$ system_profiler SPSoftwareDataType | grep "System Version"
    System Version: OS X 10.8.5 (12F45)
$ ruby --version ; openssl version ; gem list | grep http
ruby 2.0.0p247 (2013-06-27) [x86_64-darwin12.4.0]
OpenSSL 1.0.1e 11 Feb 2013
http-cookie (1.0.2)
http_router (0.10.2)
net-http-digest_auth (1.4)
net-http-persistent (2.9)
ntlm-http (0.1.1)

el entorno anterior

No aparece el error con un poco más de la versión de ruby/OpenSSL:

$ ruby --version ; openssl version ; gem list | grep http
ruby 2.0.0p0 (2013-02-24 revision 39474) [x86_64-darwin10.8.0]
OpenSSL 0.9.8y 5 Feb 2013
http_router (0.11.0, 0.10.2)
httpauth (0.2.0)
net-http-digest_auth (1.2.1)
net-http-persistent (2.8)
ntlm-http (0.1.1)
  • Hizo instalar el Charles CA cert? (en el menú ayuda)
  • Sí. (No creo que Charles hubiera trabajado con FireFox y el rizo de lo contrario…)
  • Estás ssl proxy (aka mitm proxy)
  • precisamente. Estoy desarrollando un script automáticamente el inicio de sesión para un sitio SSL, así que estoy usando Charles para registrar las interacciones.

2 Comentarios

  1. 1

    Lo que está pasando aquí es que Charles no puede proporcionarle un certificado válido para «https://www.ibm.com«, porque cualquier certificado de configurar Charles con (o si Carlos se crea su propio certificado, no puede ser para el «www.ibm.com» nombre Y certificados por una autoridad de certificación de confianza. Es por eso que la conexión falla si el cliente verifica el certificado, y funciona si se salta la verificación con

    http.verify_mode = OpenSSL::SSL::VERIFY_NONE

    Probablemente trabajado con la versión anterior de ruby porque «net/https» fue ajustado para verificar
    certificados por defecto, sólo recientemente.

    • He activado la casilla de verificación a tu respuesta, ya que es completa y ofrece una explicación de por qué se comportó de la manera que lo hizo. Gracias.
    • Me gustaría preguntarle a bajar el tono un poco. Y sí: yo sé lo que la desactivación de certificado de verificación de medios. Incluso me explique que (en cierto grado) en mi respuesta. Sin embargo, el OP quiere saber cuál es la diferencia entre las versiones de ruby, y puedo decir exactamente eso.
  2. 0

    Me parece recordar que necesitan a punto para que el cert en un ENV var. Si usted no está realmente preocupado de verificar, es más fácil:

    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    • Que funciona, pero no estoy seguro de por qué. Yo estaba bajo la impresión de que era el proxy de la prestación de los certs-que los certs es el agente de http verificar (o no verificar, en este caso)?
    • Esa es una buena pregunta. Yo siempre supuse que era la conexión inicial entre ruby y Charles.

Dejar respuesta

Please enter your comment!
Please enter your name here