2013-05-23 15 views
5

Sto provando a utilizzare RestClient per recuperare una pagina protetta mediante un certificato client SSL. Il mio codice è il seguente:RestClient che non riesce a OTTENERE risorsa utilizzando il certificato client SSL

require 'restclient' 

p12 = OpenSSL::PKCS12.new(File.read('client.p12'), 'password') 
client = RestClient::Resource.new('https://example.com/', 
            :ssl_client_key => p12.key, 
            :verify_ssl => OpenSSL::SSL::VERIFY_NONE) 
client.get 

quando l'eseguo, compaiono i seguenti fallimento:

1.9.3-p374 :007 > client.get 
RestClient::BadRequest: 400 Bad Request 
    from /home/duncan/.rvm/gems/ruby-1.9.3-p374/gems/rest-client-1.6.7/lib/restclient/abstract_response.rb:48:in `return!' 
    from /home/duncan/.rvm/gems/ruby-1.9.3-p374/gems/rest-client-1.6.7/lib/restclient/request.rb:230:in `process_result' 
    from /home/duncan/.rvm/gems/ruby-1.9.3-p374/gems/rest-client-1.6.7/lib/restclient/request.rb:178:in `block in transmit' 
    from /home/duncan/.rvm/rubies/ruby-1.9.3-p374/lib/ruby/1.9.1/net/http.rb:745:in `start' 
    from /home/duncan/.rvm/gems/ruby-1.9.3-p374/gems/rest-client-1.6.7/lib/restclient/request.rb:172:in `transmit' 
    from /home/duncan/.rvm/gems/ruby-1.9.3-p374/gems/rest-client-1.6.7/lib/restclient/request.rb:64:in `execute' 
    from /home/duncan/.rvm/gems/ruby-1.9.3-p374/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `execute' 
    from /home/duncan/.rvm/gems/ruby-1.9.3-p374/gems/rest-client-1.6.7/lib/restclient/resource.rb:51:in `get' 
    from (irb):7 
    from /home/duncan/.rvm/rubies/ruby-1.9.3-p374/bin/irb:13:in `<main>' 

Sono abbastanza sicuro che questo è un fallimento per l'autenticazione, come ottengo lo stesso errore nella un browser se non installo il certificato client.

Sto usando OpenSSL::SSL::VERIFY_NONE perché il server ha un certificato autofirmato, e credo che questo sia il valore corretto da passare per ignorarlo.

Qualsiasi suggerimento su come ottenere questo funzionamento sarebbe molto apprezzato - anche un puntatore a qualche documentazione dettagliata, o un suggerimento di un diverso gioiello potrebbe funzionare. Non ho avuto molta fortuna sia con i documenti gemma o Google :(

risposta

6

La tua richiesta HTTPS avrà bisogno il certificato client, nonché la chiave di Prova:.

client = RestClient::Resource.new('https://example.com/', 
            :ssl_client_cert => p12.certificate, 
            :ssl_client_key => p12.key, 
            :verify_ssl => OpenSSL::SSL::VERIFY_NONE) 

Se questo non lo fa puoi provare a catturare i pacchetti handshake (ad es. con WireShark) per verificare che l'API offra il certificato

+4

Avere una soluzione con 'VERIFY_NONE' è così sbagliato in così tanti livelli ... Qual è il punto di utilizzo di ssl quando non si verifica il certificato? –

+1

@JarmoPertman 'VERIFY_NONE' è utile quando si sviluppa localmente contro un server con un certificato autofirmato. – WildlyInaccurate

+3

Sì, ma quando SO è pieno di risposte accettate con VERIFY_NONE' senza alcuna spiegazione su cosa potrebbe effettivamente fare, è molto probabile che codice come questo finirà ovunque e nessun certificato verrà verificato. –

Problemi correlati