Java-Ausnahme auf SSLSocket Erstellung
In den code:
System.setProperty("javax.net.ssl.trustStore", cacerts);
System.setProperty("javax.net.ssl.trustStorePassword", pwdCacerts);
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket("localhost", port);
Ich dafür eine Java-Ausnahme:
java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
at javax.net.ssl.DefaultSSLSocketFactory.throwException(Unknown Source)
at javax.net.ssl.DefaultSSLSocketFactory.createSocket(Unknown Source)
at PracticaRO.Cliente.main(Cliente.java:24)
Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
at java.security.Provider$Service.newInstance(Unknown Source)
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at sun.security.jca.GetInstance.getInstance(Unknown Source)
at javax.net.ssl.SSLContext.getInstance(Unknown Source)
at javax.net.ssl.SSLContext.getDefault(Unknown Source)
at javax.net.ssl.SSLSocketFactory.getDefault(Unknown Source)
at PracticaRO.Cliente.main(Cliente.java:23)
Caused by: java.io.IOException: Invalid keystore format
at sun.security.provider.JavaKeyStore.engineLoad(Unknown Source)
at sun.security.provider.JavaKeyStore$JKS.engineLoad(Unknown Source)
at java.security.KeyStore.load(Unknown Source)
at sun.security.ssl.TrustManagerFactoryImpl.getCacertsKeyStore(Unknown Source)
at sun.security.ssl.SSLContextImpl$DefaultSSLContext.getDefaultTrustManager(Unknown Source)
at sun.security.ssl.SSLContextImpl$DefaultSSLContext.<init>(Unknown Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
... 7 more
Es funktionierte gut, bis ich importierte den neuen öffentlichen Schlüssel in cacerts mit -keytool -import -keystore cacerts -alias kpServer type JCEKS -file Server.cer
was die Ursache der Ausnahme oben.
Vielen Dank im Voraus für jede Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werde ich gehen Sie durch den setup-Prozess. Ich schlage vor, Sie verwenden nur ein Passwort für alles nur für Sie nicht zu verwirren mit ihm auf den ersten.
Befolgen Sie diese Schritte:
1. Auf Der Kommandozeile:
Erstellen Sie ein Öffentliches/Privates Schlüsselpaar mit RSA, 2048 bit, entity-name ist "secureEntity", gespeichert in der Datei "server.keyStore".
1.1 keytool -genkeypair -alias secureEntity -keyalg RSA -keysize 2048 - keystone-server.keyStore
Diesem Befehl gespeichert, die einen Privaten Schlüssel und einen Öffentlichen Schlüssel für "secureEntity".
Der Private Schlüssel, den nur Sie Zugriff haben sollten, um es (durch das wissen, Datei Passwort).
Der Öffentliche Schlüssel gespeichert ist, als ein Zertifikat, so folgt X509-Zertifikat-Protokoll-Felder. Auf diese Weise können wir davon ausgehen, es enthält einen öffentlichen Schlüssel, und dieser öffentliche Schlüssel zugeordnet ist, um "secureEntity".
Und das ist, was wir wissen müssen, für uns ist das Zertifikat zu überprüfen, die vom server gesendet an den client.
SSL ersten Schritt die Validierung erfolgt durch den client, sodass der client überprüft die server in den ersten Platz.
So, jetzt haben wir generiert ein Zertifikat und es ist gespeichert in den server.keyStore wir exportieren können, um in der Lage sein, um es zu importieren, in einem oder mehreren trustStore.
Die Art, wie wir es tun:
1.2 keytool -exportcert -alias secureEntity -Datei exportiert.cer -keystore server.keystore
So, jetzt können wir hinzufügen, um unsere wirklich trustStore-Datei, und es wird Sie bitten uns zu bestätigen, dass wir wirklich Vertrauen, dass die Person direkt nach dem import. Wenn die Datei nicht vorhanden ist, es auch automatisch erstellt werden.
1.3 keytool -importcert -alias secureEntity -keystore trustedEntities.trustStore -Datei exportiert.cer
Nun für die Bequemlichkeit, können Sie importieren eine Datei, die enthält nur server-Zertifikat:
1.4 keytool -importcert -alias secureEntity -keystore serverKeys.keyStore -Datei exportiert werden.cer
Damit Ihr server sollte nun einen privaten und einen öffentlichen Schlüssel (Zertifikat).
In JAVA:
Client-Seite:
System.setProperty("javax.net.ssl.trustStore","trustedEntities.trustStore")
und Erstellen sslsocket hier
Server-Seite:
System.setProperty("javax.net.ssl.keyStore", "serverKeys.keyStore")
System.setProperty("javax.net.ssl.keystorePass Word", "serverKeys.keyStore-DATEI PASSWORT, DAS SIE VORHER DEFINIERT")
Erstellen Sie ein server-ssl und das Wars.
Hoffe, das hilft. Prost!
Ich habe die Lösung aus einem anderen Weg, ich Teile es für jemanden, der kommt hier mit dem gleichen problem:
Muss ich fügen Sie diesen code
weil es standardmäßig erwartet einen JKS-Typ.
Die Datei, die Sie importiert (auf dem Server.cer) ist nicht in dem format java erwartet. Sie erzählte keytool das format wurde JCEKS. Ich glaube, dass bedeutet, es ist ein full-keystore zu generieren, die wahrscheinlich nicht für eine Datei mit dem Namen Server.cer.
Haben Sie möglicherweise verwenden wollte -Typ PKCS12 statt.
Danke für deine Antwort...
Mein problem gelöst, indem Sie diesen code ein :
Code wie folgt :