2010-01-23 15 views
7

Sto solo cercando di capire come usare SSL.Utilizzo di un certificato autofirmato

Ho installato un server Jetty sul mio localhost e generato il mio certificato utilizzando Keytool.

Ora quando vado a https://localhost:8443/ ottengo il non posso fidarmi di questo errore di certificato.

Io uso

keytool -export -alias pongus -keystore chiavi -file certfile.cer

Per creare il certificato che credo sia quello che il cliente ha bisogno di autenticazione con il server. (Questo è dove ho potuto essere molto sbagliato!)

Ho il seguente codice Ruby:

require 'net/https' 
require 'openssl' 

require 'open-uri' 

puts 'yay' if File.exists?('certfile.cer') 

uri = URI.parse("https://localhost:8443/") 
http_session = Net::HTTP.new(uri.host, uri.port) 
http_session.use_ssl = true 
http_session.verify_mode = OpenSSL::SSL::VERIFY_PEER 
http_session.ca_file = 'certfile.cer' 
res = http_session.start do |http| 
    # do some requests here 
    http.get('/') 
end 

Ciò print 'yay', in modo che il file di certfile.cer esiste.

ma ottengo gli errori

/Applications/NetBeans/NetBeans 6.8.app/Contents/Resources/NetBeans/ruby2/jruby-1.4.0/lib/ruby/1.8/net/http.rb:586 warning: can't set verify locations 
/Applications/NetBeans/NetBeans 6.8.app/Contents/Resources/NetBeans/ruby2/jruby-1.4.0/lib/ruby/1.8/net/http.rb:586:in `connect': certificate verify failed (OpenSSL::SSL::SSLError) 

Tutte le idee che sto facendo male?

EDIT

voglio farlo in modo vi garantisco che sto connessione al server destra, e il server posso garantire che sono io il collegamento ad esso, senza alcuna manomissione in mezzo. Sto sviluppando sia il server che il client.

risposta

5

Il client deve accedere alla sua chiave privata .

non avete bisogno della chiave privata per la verifica del certificato del server. Tutto ciò di cui hai bisogno è il certificato stesso che contiene la chiave pubblica. Solo il server ha la chiave privata. qui http://www.helpbytes.co.uk/https.php e qui http://www.verisign.com/ssl/ssl-information-center/how-ssl-security-works/

ben descritto la mia raccomandazione è semplice. Controlla che il tuo certificato sia corretto.

openssl x509 -text -in mycert.crt 

anche se si ha accesso al server si può esplicitamente validare se il certificato e la chiave (usato nella configurazione di httpd) sono corrette (partite): http://kb.wisc.edu/middleware/page.php?id=4064 Si prega di notare che questo è controllo esplicito riceve un server. Non dare mai la chiave privata. Questo controllo può essere effettuato solo dall'amministratore per verificare se l'httpd non è stato configurato in modo errato.

È inoltre possibile eseguire il debug della comunicazione del certificato SSL utilizzando il comando standard openssl. Emetti questo comando quindi attendi qualche secondo, quindi digita QUIT e premi invio. Vedrai il certificato che il server invia.

openssl s_client -connect your.server.com:443 

Prova anche a importare il certificato nel browser e accedere alla risorsa URL. Il browser è in grado di convalidarlo facendo clic su https (Firefox e Chrome). Quindi vedrai il certificato stesso e le informazioni sulla validità.

Tutto quanto sopra riguardava il certificato del server . Questa è solo una parte del problema. "Mi sto connettendo al server giusto, e il server può garantire che mi si connetta ad esso" Actully nel tuo codice sopra si controlla solo per il certificato del server. Adesso. Se si desidera un certificato client (la seconda parte della sua dichiarazione) che avete bisogno di questo in Ruby:

File.open("client_certificate.pem", 'rb') { |f| cert = f.read } 
File.open("client_key.pem", 'rb') { |f| key = f.read } 
http_session.cert = OpenSSL::X509::Certificate.new(cert) 
http_session.key = OpenSSL::PKey::RSA.new(key, nil) 

Questo è il modo client cert dovrebbe essere usato in Ruby. Se la tua chiave privata è crittografata con una password, passala invece nil nel secondo argomento del costruttore RSA.

Consiglio vivamente di ottenere il certificato del server funzionante (il codice) e quindi iniziare con il certificato client. Tieni presente che mantieni il codice corrente (ca_cert, costante di convalida) e aggiungi le quattro righe sopra indicate.

Spero che questo aiuti.

+0

In ogni caso NON HAI BISOGNO di una chiave privata sul tuo client. Mai e poi mai. Periodo. – lzap

+0

Un'altra cosa.Puoi anche ESPORTARE il certificato usando Firefox o IE! È molto semplice. Accedere alla pagina ed esportarla in un file PEM. Puoi usare quello con Ruby. L'ho fatto diverse volte. Lavori! – lzap

+0

Sbagliato. Semplicemente non capisci l'autenticazione del client SSL, che è ciò che l'interrogante ha dichiarato chiaramente di cui ha bisogno. "... che penso sia ciò che il client ha bisogno di autenticare con il server ..." così come il commento nella modifica indica questo. –

-8

Change

http_session.verify_mode = OpenSSL::SSL::VERIFY_PEER 

a

http_session.verify_mode = OpenSSL::SSL::VERIFY_NONE 

Una volta fatto questo, il protocollo SSL funzionerà correttamente. L'ho usato più volte nei miei ambienti di sviluppo, funziona sempre in modo impeccabile.

+1

Grazie, ma non voglio che elimini la verifica. . ;-) –

+0

Eugene, cosa ne pensi del tuo piccolo trucco? –

+0

Mi dispiace che ci sia voluto così tanto tempo per rispondere a questo. Poiché VERIFY_PEER tenta di convalidare il certificato contro un emittente SSL noto, è necessario utilizzare VERIFY_NONE per ignorare questo controllo. Non convalida il certificato in sé, ma convalida l'emittente del certificato. Poiché i certificati autofirmati non hanno emittenti noti, falliscono il controllo. – Eugene

0

Il client deve accedere alla sua chiave privata. La chiave privata non è nel certificato, il certificato contiene solo la chiave pubblica. Scusate, non so ruby, ma una tecnica comune è quella di raggruppare la chiave privata e il certificato in un singolo PKCS # 12, detto p12, e fornirlo alla libreria crittografica.

+0

Bello, questa è una buona informazione per darmi qualcosa su cui andare! Tornerò alla documentazione di keytool. Grazie –

+0

Ruby accetta PEM. Non c'è assolutamente bisogno di p12 e chiave privata. È un buco di sicurezza per dare il PK :-) – lzap

+1

@Izap: non c'è una chiave privata, ce ne sono due: una per il client e una per il server. Questo è il motivo per cui ho detto che il client ha bisogno di accedere alla chiave privata * ITS *, non al server. –

Problemi correlati