Sto provando ad installare una connessione SSL Socket (e sto facendo il seguente sul client)Ricevuto avviso fatale: bad_certificate
ho generare un Certificte richiesta di firma per ottenere un certificato client firmato
Ora ho una chiave privata (utilizzata durante la CSR), un certificato client firmato e un certificato radice (ottenuto fuori banda).
Aggiungo la chiave privata e il certificato client firmato a una catena di certificati e la aggiungo al gestore delle chiavi. e il certificato di root per il gestore di fiducia. Ma ottengo un errore di certificato errato.
Sono sicuro che sto usando i certificati giusti. Devo aggiungere anche il certificato cliente firmato al gestore di fiducia? Ho provato questo, senza fortuna ancora.
//I add the private key and the client cert to KeyStore ks
FileInputStream certificateStream = new FileInputStream(clientCertFile);
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
java.security.cert.Certificate[] chain = {};
chain = certificateFactory.generateCertificates(certificateStream).toArray(chain);
certificateStream.close();
String privateKeyEntryPassword = "123";
ks.setEntry("abc", new KeyStore.PrivateKeyEntry(privateKey, chain),
new KeyStore.PasswordProtection(privateKeyEntryPassword.toCharArray()));
//Add the root certificate to keystore jks
FileInputStream is = new FileInputStream(new File(filename));
CertificateFactory cf = CertificateFactory.getInstance("X.509");
java.security.cert.X509Certificate cert = (X509Certificate) cf.generateCertificate(is);
System.out.println("Certificate Information: ");
System.out.println(cert.getSubjectDN().toString());
jks.setCertificateEntry(cert.getSubjectDN().toString(), cert);
//Initialize the keymanager and trustmanager and add them to the SSL context
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, "123".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(jks);
C'è una sorta di catena di certificati che ho bisogno di creare qui?
Avevo un p12 anche con questi componenti e dopo aver usato codice abbastanza simile, aggiungendo la chiave privata al keymanager e il cert root da p12 al gestore di fiducia, potevo farlo funzionare. Ma ora ho bisogno di farlo funzionare senza la p12.
MODIFICA: è stata richiesta la traccia di stack. Spero che questo dovrebbe essere sufficiente. (NOTA: I mascherato i nomi dei file)
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1720)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:954)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1149)
at client.abc2.openSocketConnection(abc2.java:33)
at client.abc1.runClient(abc1.java:63)
at screens.app.abc.validateLogin(abc.java:197)
... 32 more
Grazie ancora. Ho aggiunto il certificato cliente e la chiave privata al primo keystore (k1) e poi k1 al keymanagerfactory. Quindi il certificato radice a keystore (k2) e k2 a trustmanagerfactory – highflyer
Vuoi dire "aggiungi cert root a truststore", giusto? – FaithReaper