2010-10-27 19 views
6

Estoy intentando acceder a un servicio web HTTPS que usa autenticación SSL cert usando Ruby EventMachine pero no lo estoy haciendo funcionar.¿Cómo obtengo una solicitud HTTPS con SSL client cert para trabajar con Ruby EventMachine?

He escrito el siguiente bloque de código simple para probar que de extremo a extremo:

require 'rubygems' 
require 'em-http' 

EventMachine.run do 
    url = 'https://foobar.com/' 
    ssl_opts = {:private_key_file => '/tmp/private.key', 
    :cert_chain_file => '/tmp/ca.pem', 
    :verify_peer => false} 
    http = EventMachine::HttpRequest.new(url).get :ssl => ssl_opts 

    http.callback do 
    p http.response_header.status 
    p http.response_header 
    p http.response 
    EventMachine.stop 
    end 

    http.errback do 
    EventMachine.stop 
    fail "Request failed" 
    end 
end 

Ejecución de las salidas anteriores <SSL_incomp> seguido por el mensaje de RuntimeError elevada. He intentado ejecutar con :verify_peer establecido en verdadero y falso y me da el mismo error. Ejecutando EventMachine::HttpRequest#get sin la opción :ssl hace lo mismo.

también he tratado de enviar la solicitud a Gmail (https://mail.google.com) sin la opción :ssl (es decir, HTTPS plano sin cert) y que funciona, la salida de código de estado 200, las cabeceras y el cuerpo.

He intentado hacer la misma petición al servicio web con el enrollamiento y que funciona:

curl --silent --cert /tmp/private.key --cacert /tmp/ca.pem https://foobar.com/ 

Pienso que estoy bien poniendo la gema em-petición http o EventMachine incorrectamente o que el SSL los archivos están en un formato que funciona con curl pero no con EventMachine.

¡Si alguien sabe cómo resolver el ejemplo anterior o proporciona un ejemplo similar usando EventMachine directamente sería muy apreciado!

Respuesta

2

El archivo pasado a curl's --cert contiene tanto el certificado como la clave (a menos que pase en un --key por separado). Sólo tiene que utilizar /tmp/private.key como argumento a la vez :private_key_file y :cert_chain_file

Ver http://github.com/eventmachine/eventmachine/issues/#issue/115 para más detalles sobre el tema y un parche que expone el error subyacente (en lugar de simplemente imprimir SSL_incomp).