Sto provando a collegarmi a un webservice sicuro.perché java non invia il certificato del client durante l'handshake SSL?
Si è verificato un errore durante l'handshake anche se il keystore e il truststore sono stati impostati correttamente.
Dopo diversi giorni di frustrazione, interminabili ricerche su google e chiedendo a tutti in giro ho scoperto che l'unico problema era che java ha scelto di non inviare il certificato client al server durante l'handshake.
In particolare:
- server richiesto un certificato client (CN = RootCA) - vale a dire "dammi un cert che è firmato dal CA principale"
- Java guardato nell'archivio chiavi e ha trovato solo il mio cliente certificato che è firmato dal "SubCA", che a sua volta è emesso dal "RootCA". Non si è preoccupato di guardare nel truststore ... duh OK immagino
- Purtroppo quando ho provato ad aggiungere il certificato "SubCA" al keystore, questo non mi è stato di nessun aiuto. Ho controllato se i certificati vengono caricati nel keystore. Lo fanno, ma il KeyManager ignora tutti i certificati tranne quello client.
- Tutti i cavi sopra al fatto che Java decide che non ha certificati che soddisfano la richiesta del server e invia niente ... tadaaa mancata stretta di mano :-(
Le mie domande:
- È possibile che abbia aggiunto il certificato "SubCA" al keystore in un modo che "ha rotto la catena di certificati" o qualcosa in modo che il KeyManager carichi solo il certificato client e ignori il resto? (Chrome e openssl riescono a capire perché così non può java? - nota che il certificato "SubCA" viene sempre presentato separatamente come autorità fidata così Chrome appare ntly correttamente lo comprime insieme al client cert durante l'handshake)
- Si tratta di un "problema di configurazione" formale sul lato server? Il server è di terze parti. Mi aspetto che il server richieda un certificato firmato dall'autorità "SubCA" poiché è ciò che ci hanno fornito. Sospetto che il fatto che funzioni in Chrome e openssl sia perché sono "meno restrittivi" e java va semplicemente "dal libro" e fallisce.
Sono riuscito a mettere insieme una soluzione sporca per questo, ma non ne sono molto contento quindi sarei felice se qualcuno può chiarire questo per me.
Vale la pena aggiungere alla risposta di @ Bruno che il motivo sottostante è che c'era una chiave privata ma nessun certificato corrispondente (cioè con lo stesso alias), quindi Java non poteva inviarne uno quando veniva richiesto dai messaggi 'CertificateRequest'. Altri motivi per questo possono includere nessun certificato firmato dagli emittenti specificati dal server, oppure nessun certificato corrispondente ai codici cifrati specificati dal server. – EJP
Abbiamo risolto questo problema solo facendo corrispondere le cifre specificate dal server. Grazie ragazzi per tutte queste informazioni, è stato molto utile. –