Ich versuche, eine SSL Socket-Verbindung einrichten (und auf dem Client die folgenden tue)Schwerwiegender Alarm empfangen: bad_certificate
I erzeugen eine Certificte Antrag Unterzeichnung eines signierten Client-Zertifikat
- zu erhalten
Jetzt habe ich einen privaten Schlüssel (verwendet während der CSR), ein signiertes Client-Zertifikat und ein Root-Zertifikat (out-of-Band erhalten).
Ich füge den privaten Schlüssel und das signierte Client-Zertifikat zu einer Cert-Kette hinzu und füge das dem Schlüssel-Manager hinzu. und das Root-Zertifikat zum Trust-Manager. Aber ich bekomme einen schlechten Zertifikatfehler.
Ich bin ziemlich sicher, dass ich die richtigen Zertifikate verwende. Soll ich das signierte Client-Zertifikat auch dem Trust-Manager hinzufügen? Versuchte das, kein Glück noch.
//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);
Gibt es eine Art Zertifikatskette, die ich hier erstellen muss?
Ich hatte auch einen P12 mit diesen Komponenten und nach der Verwendung ziemlich ähnlichen Codes, Hinzufügen des privaten Schlüssels zum Schlüsselmanager und des Stammzertifikats von P12 zum Vertrauensmanager, könnte ich es zum Funktionieren bringen. Aber jetzt muss ich es ohne den p12 arbeiten lassen.
EDIT: Stack-Trace wurde angefordert. Hoffe, das sollte ausreichen. (Anmerkung: ich die Dateinamen maskiert)
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
Danke nochmal. Ich habe das Client-Zertifikat und den privaten Schlüssel zum ersten Keystore (k1) hinzugefügt und dann k1 zum keymanagerfactory. Dann das root cert zu keystore (k2) und k2 zur trustmanagerfactory – highflyer
Du meinst "root cert zu truststore hinzufügen", oder? – FaithReaper