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.
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
Il PEM contiene il certificato sotto ---- BEGIN CERTIFICATE ----- block e la chiave privata sotto a ----- BEGIN RSA PRIVATE KEY ----- block. –