2012-02-07 20 views
12

Tengo un entorno de prueba que usa Ruby para conducir un servidor a través de una conexión https. Dado que las últimas versiones de Ruby se niegan a conectarse a un servidor https con un certificado no válido (consulte this earlier question of mine) y me gustaría comenzar a utilizar una versión más nueva de Ruby, estoy tratando de configurar un certificado válido.Conexión usando https a un servidor con un certificado firmado por una CA Creé

He creado un certificado de CA para usar (hay varios servidores que se prueban para que parezca más fácil), y lo he usado con éxito para firmar un nuevo certificado que se ha instalado en un servidor y se está utilizando. He agregado el certificado de CA a la tienda del navegador y ahora (el navegador) se conectará al servidor sin quejarse. Por lo tanto, estoy seguro de que mis certificados son válidos y están configurados correctamente.

Sé que Ruby no utiliza la misma tienda que el navegador. He utilizado el archivo de CA disponible here para probar la conexión a otros servidores (públicos) (establecido mediante el método Net::HTTP#ca_file=) y esto también funciona.

Lo que no puedo conseguir es que Ruby se conecte a mi servidor utilizando mi certificado. He intentado varias formas de señalar que en mi certificado (incluyendo la adición de mi certificado al archivo vinculado anteriormente) y que siempre da el mismo error:

SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 read server hello A (OpenSSL::SSL::SSLError) 

¿Qué tengo que hacer para convencer a Ruby a aceptar mi certificado y conectarse a mi servidor?

El código que estoy utilizando es:

require 'net/https' 

uri = URI.parse("https://hostname/index.html") 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.verify_mode = OpenSSL::SSL::VERIFY_PEER 
http.ca_file = "My CA cert file" 
request = Net::HTTP::Get.new(uri.path) 
response = http.request(request) 

Asumo que esto está mal de alguna manera. Lo que quiero saber es, ¿qué debo hacer para usar mi certificado de CA?

+0

¿Dice que también ejecuta su servidor con Ruby? ¿Podría publicar los fragmentos de código relevantes para el cliente y el servidor? – emboss

+0

@emboss el servidor no es Ruby (en realidad es Tomcat aunque no creo que eso importe). No estoy seguro de qué código querría ver. Solo estoy usando la biblioteca estándar de Ruby https. – Jonathan

+0

@Jonathan, pegar el código de cliente que está utilizando para conectarse a su servidor sería un punto de partida. –

Respuesta

20

Supongo que a su Tomcat no le gusta la versión de protocolo que Ruby intenta negociar. Ruby usa SSLv23 de forma predeterminada, pero he escuchado otros casos en los que esto era un problema para los servidores web basados ​​en Java. El mensaje de error que está recibiendo indica que el protocolo de enlace falla al configurar la conexión y al intentar leer la respuesta del servidor. Trate de añadir ya sea

http.ssl_version = :TLSv1 

o

http.ssl_version = :SSLv3 

y ver si eso ayuda ya.

Si esto no soluciona el problema aún, sería muy interesante ver por qué su servidor rechaza el intento de conexión. Intente ejecutar su Tomcat con -Djavax.net.debug=ssl y publique las partes pertinentes (información de conexión, stacktrace de excepción) sobre por qué falla el intento.

+0

¡Esto funciona! Muchas gracias. ¡Sabía que tenía que ser algo simple que me estaba perdiendo! – Jonathan

+0

¡De nada! En realidad, tú también podrías ayudarme. Necesito averiguar si esto es un error real en el lado de Java. El uso de SSLv23 en el lado del cliente es como decirle al servidor "Puedo hacer cualquier protocolo que usted desee, solo nómbrelo", por lo que Tomcat no debería haber rechazado en primer lugar. ¿Qué versión exacta de Tomcat estás usando, cuál JDK? – emboss

+0

Fuera de interés, si lo sabe, ¿se modificó este valor predeterminado recientemente? Este problema solo ocurre con las últimas versiones (1.8.7-p352 y 1.9.2p290). Las versiones anteriores están bien. – Jonathan

0

Asegúrese de que el archivo de su certificado está en formato PEM, no CRT (por lo que dice documentation for Net::HTTP in Ruby 1.9.3).

Actualización Parece que la documentación no está actualizada, Ruby 1.9.3 aceptará cualquier tipo de certificado.

+0

Esto no importa. Ruby puede tratar con (incluidos) los archivos de certificado PEM así como con los certificados codificados DER. Esa es una de sus características convenientes en realidad, no necesita importar qué formato tienen sus certificados. – emboss

+0

La documentación dice lo contrario http://www.ruby-doc.org/stdlib-1.9.3/libdoc/net/http/rdoc/Net/HTTP.html#attribute-i-ca_file pero te creeré, nunca intentado con certificados que no sean PEM. – gioele

+0

Oops, lo siento, entonces tengo que actualizar la documentación :) Muy mal, ¿puedes hacer una microedición, para poder quitarle el voto negativo? – emboss

2

Estoy usando ruby ​​1.9.3 y tuve el mismo error al usar nokogiri para analizar algunas URL seguras.

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: (null) 

La respuesta fue proporcionada por relieve es correcta, pero asegúrese de que el error SSL generado es éste que se menciona anteriormente.Seguí lo mismo y encontré una solución como esta que se menciona a continuación.

uri = URI(url) 
http = Net::HTTP.new(uri.host, uri.port) 
http.use_ssl = true 
http.ssl_version = :SSLv3 
http.verify_mode = OpenSSL::SSL::VERIFY_PEER 
response = http.get(url) 

ahora la respuesta es tener la correcta HTML analizada para la url asegurado que se pasa a los códigos en la url.

Cuestiones relacionadas