web-dev-qa-db-de.com

SSL Java java.io.IOException: Ungültiges Keystore-Format

Ich teste SSL in Java mit SSLServerSocket und anderen Klassen im Java.ssl-Paket. Wenn ich den folgenden Code ausführen, erhalte ich die Ausnahme Java.io.IOException: Ungültiges 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 einfügen, weiß jedoch nicht, was ich darin einfügen soll. Vermutlich ein versengtes Objekt.

BEARBEITEN: Kundencode:

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();
        }
    }
}
9
Java Is Cool

Ihre Datei ist ungültig. Sie müssen eine JKS-Keystore-Datei und keine TXT-Datei importieren. Sie müssen mit keytool Ihre Keystore-Datei erstellen und diese Datei dann importieren.

7
VGe0rge

Ich hatte genau das gleiche Problem. In der Tat war die Keystore-Datei ungültig und nicht mit der JDK // JRE-Version verknüpft. Das Problem in meinem Fall wurde von Maven verursacht. Ich habe die folgende Option in meiner POM-Datei verwendet:

<resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>

Der "wahre" Wert in der Filterung hat die Schlüsseldatei verändert. Daher war die Schlüsseldatei, die in Springpath in meinem Klassenpfad verfügbar war, nicht genau dieselbe, die ich in meinem Verzeichnis "src/main/resources" hatte, und die die Ausnahme "Ungültiges Keystore-Format" verursacht hat. Als ich mit keytool getestet habe, habe ich den unter dem "resources" -Ordner verwendet, so dass das eigentliche Problem irreführend war. 

Lösung des Problems: Ändern Sie in Ihrer Datei pom.xml den Wert für "filter" in "false" . Eine andere Möglichkeit, das Problem zu lösen, bestand darin, explizit den Speicherort des Keystores in der Datei application.properties anzugeben. Also statt:

server.ssl.key-store: classpath:keystore.jks

Ich benutzte

server.ssl.key-store: keystore/keystore.jks
5
acaruci

Ich hatte das gleiche Problem, als load keystore mit dem folgenden Code:

KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
Resource resource = new ClassPathResource(file);
trustStore.load(resource.getInputStream(), password.toCharArray());

Es stellte sich als JDK-Problem heraus, es funktioniert nicht mit jre1.8.0_25. Wenn ich die JDK-Version auf den neuesten jre1.8.0_121 aktualisiere, funktioniert es.

3
Dave Pateral

Ich sah diese Ausnahme:

Ungültiges Keystore-Format

beim Ausführen einer Java-Anwendung mit JRE-1.8.0_40 unter CentOS 6.6 64-Bit-Linux.

Bei Verwendung von JRE-1.8.0_172 ging die Ausnahme weg.

0
user674669