2012-07-13 12 views
5

Ho un sistema pienamente operativo in cui i client basati su openssl interagiscono con un server openssl. Ogni client ha il proprio certificato che viene convalidato dal server. I certificati sono stati generati con openssl (X509, pem). Sono autofirmati.Il client SslStream non è in grado di completare l'handshake con il server stunnel

Ora desidero scrivere un client di prova basato su SslStream. Ho usato l'esempio del client dalla classe SslStream documentation.

Il mio client SslStream non è in grado di completare l'handshake. stunnel si lamenta del fatto che il cliente non abbia inviato il suo certificato. Ciò è confermato in Wireshark (Lunghezza certificati: 0 nei messaggi di handshake).

Il mio cliente viene visualizzato il seguente eccezione:

Eccezione interna: il messaggio ricevuto era imprevisto o formattato

Questo è come io carico il mio certificato:

X509Certificate cert = new X509Certificate2(filename, password); 
X509CertificateCollection certColl = new X509CertificateCollection(); 
certColl.Add(cert); 

Ho provato a recuperare varie proprietà del certificato (es: GetSerialNumberString()). Funziona. Il metodo di verifica restituisce false. Questa è la prossima cosa che ho intenzione di indagare.

Come ho configurato il mio SslStream non sembra avere importanza (stesso risultato):

sslStream.AuthenticateAsClient(serverName); 

SslStream sslStream = new SslStream(
    client.GetStream(), 
    false, 
    new RemoteCertificateValidationCallback(ValidateServerCertificate), 
    new LocalCertificateSelectionCallback(SelectLocalCertificate)); 

Lo stesso vale per l'autenticazione:

sslStream.AuthenticateAsClient(serverName); 

sslStream.AuthenticateAsClient(serverName, 
    certColl, 
    SslProtocols.Tls, 
    true); 

SelectLocalCertificate viene chiamato (due volte) e restituisce il mio certificato. ValidateServerCertificate al momento non viene mai chiamato (con mia sorpresa).

Come posso eseguire il debug di questo? Ancora meglio se riesci a inchiodare il mio problema.

UPDATE

ho aggiunto una funzione per eseguire la convalida della catena in base alla X509Chain example dalla documentazione. Esso visualizza tutti i tipi di informazioni sul certificato, tra cui due messaggi intriganti:

Element certificate is valid: False 
Element error status length: 1 

Alla fine, io in realtà non hanno più dettagli rispetto a quando io chiamo verificare.

L'output di openssl verify cert.pem non segnala nulla di insolito.

error 18 at 0 depth lookup:self signed certificate 
OK 

UPDATE

ho estratto la chiave privata e il certificato dalla PEM, e mi ha generato un cert.pfx (PKCS12). Non ho avuto problemi con l'importazione di cert.pfx nel mio keystore personale. Nei dettagli del mio certificato, posso vedere una piccola icona che indica una chiave privata allegata.

Ho modificato il mio cliente per recuperare il certificato dal mio negozio personale. Ma sto ottenendo lo stesso esatto fallimento.

+0

Per l'autenticazione client SSL è necessario un certificato e una chiave. Dovresti controllare se il file PEM contiene entrambi, altrimenti ti manca una parte importante. – Robert

+0

Il PEM contiene il certificato sotto ---- BEGIN CERTIFICATE ----- block e la chiave privata sotto a ----- BEGIN RSA PRIVATE KEY ----- block. –

risposta

4

La soluzione era di importare il mio certificato di origine CA sul mio computer Windows. Il mio cliente è ora in grado di completare l'handshake!

Trovato la soluzione cercando un esempio SslStream più completo. Grazie a http://geekswithblogs.net/luskan/archive/2007/10/01/115758.aspx.

+0

È necessario installare il certificato CA radice in Windows Store nella cartella Autorità attendibili e caricare il certificato client dall'archivio di Windows, ma non ha funzionato durante il caricamento del certificato client dal file. Pertanto, sia la CA principale del server che quella del server devono trovarsi nell'archivio di Windows. Grazie – AlexandruC

+0

Windows/.NET non consente di utilizzare una chiave privata se non si trova nell'archivio certificati. È di progettazione. –

Problemi correlati