SSL Java.io.IOException: Invalid keystore format
Ich die Prüfung von SSL in java mit SSLServerSocket und anderen Klassen im java.ssl-Paket. Wenn ich den folgenden code ausführen, bekomme ich die exception java.io.IOException: Invalid keystore format. Mein code:
package testing;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.security.KeyStore;
import javax.net.ServerSocketFactory;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.TrustManager;
public class SSLServerTest {
public static void main(String[] args) {
try {
int port = 3000;
SSLContext sc = SSLContext.getInstance("TLSv1.2");
KeyStore ks = KeyStore.getInstance("JKS");
InputStream ksIs = new FileInputStream("key.txt");
try {
ks.load(ksIs, "Bennett556".toCharArray());
} finally {
if (ksIs != null) {
ksIs.close();
}
}
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, "Bennett556".toCharArray());
sc.init(kmf.getKeyManagers(), new TrustManager[] {}, null);
ServerSocketFactory ssocketFactory = sc.getServerSocketFactory();
SSLServerSocket ssocket = (SSLServerSocket) ssocketFactory
.createServerSocket(port);
ssocket.setEnabledProtocols(new String[] { "SSLv3" });
Socket socket = ssocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream());
out.println("Hello, Securly!");
out.close();
in.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Datei key.txt:
1268312345812304612348712634283427346
Ich vermute, ich sollte etwas anderes in die key.txt Datei, aber ich weiß nicht, was in Sie setzen. Wahrscheinlich ein searilized Objekt.
EDIT: der Client-Code:
package testing;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;
import javax.net.SocketFactory;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;
public class SSLClientTest {
public static void main(String[] args) {
int port = 3000;
String host = "localhost";
try {
SSLContext sc = SSLContext.getInstance("TLSv1.2");
KeyStore ks = KeyStore.getInstance("JKS");
InputStream ksIs = new FileInputStream("key.txt");
try {
ks.load(ksIs, "Bennett556".toCharArray());
} finally {
if (ksIs != null) {
ksIs.close();
}
}
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, "Bennett556".toCharArray());
sc.init(kmf.getKeyManagers(), new TrustManager[] {}, null);
SocketFactory factory = sc.getSocketFactory();
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
socket.startHandshake();
BufferedReader in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String str = "";
while ((str = in.readLine()) != null)
System.out.println(str);
in.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
- Eine KeyStore-Datei nicht um eine text-Datei.
- In der Tat ein Schlüssel ist ein Schlüssel zu speichern; eine Textdatei ist kein Schlüssel speichern; und ein Schlüssel kann nicht gespeichert werden, in einer text-Datei.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Datei ist ungültig. Sie importieren einen JKS-keystore-Datei und nicht eine txt ein. Verwenden Sie die keytool zu erstellen Sie Ihre keystore-Datei und importieren Sie dann diese Datei.
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No X509TrustManager implementation available
Caused by: java.security.cert.CertificateException: No X509TrustManager implementation available
TrustManagers
wenn Sie initialisiert IhreSSLContext,
hast du nicht, natürlich gibt es keineTrustManagers
erhältlich.Ich hatte genau das gleiche Problem. In der Tat, wird die keystore-Datei ungültig war und nicht im Zusammenhang mit dem JDK//die JRE-version. Das problem in meinem Fall verursacht wurde, die von Maven. Ich war mit der folgenden option in meinem pom-Datei:
Der "wahre" Wert in der Filterung Durcheinander mit der Schlüssel-Datei. Also, das keyfile, das war in meinem classpath, wenn der Frühling war es nicht genau das gleiche hatte ich unter meinem Verzeichnis "src/main/resources" und das verursacht die Invalid Keystore Format Ausnahme. Wenn ich getestet mit keytool ich war mit der unter "Ressourcen" - Ordner, so, dass war irreführend, das eigentliche Problem.
Lösung des Problems: in Ihrer pom.xml Datei, ändern Sie den Wert für "filtering" auf "false".
Ein anderer Weg, die Lösung der Frage war explizit den Speicherort der keystore in der Anwendung.Eigenschaften-Datei. Also statt:
Ich verwendet
Ich konfrontiert mit dem gleichen problem, wenn
load keystore
mit dem folgenden code:Es stellte sich heraus, dass die JDK-Problem, es funktioniert nicht mit
jre1.8.0_25
. wenn ich ein upgrade JDK-version auf die neuestejre1.8.0_121
es funktioniert.Ich sah diese Ausnahme:
Invalid keystore format
während der Ausführung einer java-Anwendung mit JRE-1.8.0_40 auf CentOS 6.6 64-bit-linux.
Zur Verwendung der JRE-1.8.0_172, die Ausnahme ging Weg.