estoy tratando de configurar una conexión de socket SSL (y estoy haciendo lo siguiente en el cliente)recibido una alerta fatal: bad_certificate
que generan una certificte solicitud de firma para obtener un certificado de cliente firmado
Ahora tengo una clave privada (utilizada durante la CSR), un certificado de cliente firmado y un certificado raíz (obtenido fuera de banda).
Agrego la clave privada y el certificado de cliente firmado a una cadena de certificados y lo agrego al administrador de claves. y el certificado raíz para el administrador de confianza. Pero recibo un error de certificado erróneo.
Estoy bastante seguro de que estoy usando los certes correctos. ¿Debo agregar también el certificado firmado del cliente al administrador de confianza? Intenté eso, sin suerte aún.
//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);
¿Hay algún tipo de cadena de certificados que deba crear aquí?
Tuve un p12 con estos componentes también y al usar un código bastante similar, agregando la clave privada al administrador de claves y el certificado raíz de p12 al administrador de confianza pude hacerlo funcionar. Pero ahora necesito hacerlo funcionar sin el p12.
EDITAR: Se solicitó seguimiento de pila. Espero que esto sea suficiente. (NOTA: Me enmascara los nombres de archivo)
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
Gracias de nuevo. Agregué el certificado del cliente y la clave privada al primer almacén de claves (k1) y luego k1 al administrador de claves. Luego, el certificado raíz para el almacén de claves (k2) y k2 para el trustmanagerfactory – highflyer
¿Quiere decir "agregar certificado raíz al almacén de confianza", ¿verdad? – FaithReaper