2010-10-27 38 views
6

J'essaie d'accéder à un service Web HTTPS qui utilise l'authentification par certificat SSL à l'aide de Ruby EventMachine, mais je n'arrive pas à le faire fonctionner.Comment obtenir une requête HTTPS avec le certificat client SSL pour utiliser Ruby EventMachine?

J'ai écrit le bloc de code simple suivant pour le tester de bout en bout:

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 

Exécution des sorties au-dessus <SSL_incomp> suivi par le relief RuntimeError message. J'ai essayé de courir avec :verify_peer mis à la fois vrai et faux et il me donne la même erreur. Exécution EventMachine::HttpRequest#get sans l'option :ssl fait la même chose.

J'ai également essayé d'envoyer la demande à GMail (https://mail.google.com) sans l'option :ssl (c'est-à-dire HTTPS simple sans cert) et qui fonctionne, produisant le code d'état 200, les en-têtes et le corps.

J'ai essayé de faire la même demande au service web avec boucle et qui fonctionne:

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

Je pense que je suis soit en utilisant la gemme em-http-demande ou eventmachine de manière incorrecte ou que le SSL les fichiers sont dans un format qui fonctionne avec curl mais pas EventMachine.

Je sais comment résoudre l'exemple ci-dessus ou fournir un exemple similaire en utilisant EventMachine directement serait très apprécié!

Répondre

2

Le fichier transmis à --cert de curl contient à la fois le certificat et la clé (sauf si vous transmettez séparément un --key). Il suffit d'utiliser /tmp/private.key comme argument à la fois :private_key_file et :cert_chain_file

Voir http://github.com/eventmachine/eventmachine/issues/#issue/115 pour plus de détails sur la question et un patch qui expose l'erreur sous-jacente (au lieu d'imprimer SSL_incomp).