web-dev-qa-db-ja.com

SSL Java java.io.IOException:無効なキーストア形式

SSL Java SSLServerSocketおよびJava.sslパッケージの他のクラスでSSLをテストしています。次のコードを実行すると、Java.io.IOException:Invalid keystore format。Invalid code。My 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();
        }
    }
}

ファイルkey.txt:1268312345812304612348712634283427346 key.txtファイルに何か他のものを入れるべきだと思いますが、何を入れるべきかわかりません。おそらく焼かれたオブジェクト。

編集:クライアントコード:

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

ファイルが無効です。 txtファイルではなく、JKSキーストアファイルをインポートする必要があります。 keytool を使用してキーストアファイルを作成し、このファイルをインポートする必要があります。

8
VGe0rge

私はまったく同じ問題を抱えていました。実際、キーストアファイルは無効であり、JDK // JREバージョンとは関係がありませんでした。私の場合の問題は、Mavenが原因でした。 pomファイルで次のオプションを使用していました。

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

フィルタリングの「true」値がキーファイルを混乱させていました。したがって、Springの実行時にクラスパスで使用できたキーファイルは、ディレクトリ「src/main/resources」の下にあったものとまったく同じではなく、無効なキーストア形式の例外が発生しました。 keytoolでテストしたとき、「resources」フォルダーの下にあるものを使用していたため、実際の問題を誤解させていました。

問題の解決:pom.xmlファイルで、「フィルタリング」の値を「false」に変更します。この問題を解決する別の方法は、application.propertiesファイルでキーストアの場所を明示的に指定することでした。代わりに:

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

私は使った

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

load keystoreが次のコードである場合、同じ問題に直面しました。

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

それはJDKの問題であることが判明し、jre1.8.0_25では機能しません。 JDKバージョンを最新のjre1.8.0_121にアップグレードすると機能します。

5
Dave Pateral

私はこの例外を見ていました:

無効なキーストア形式

centOS 6.6 64ビットLinuxでJRE-1.8.0_40を使用してJavaアプリケーションを実行中。

JRE-1.8.0_172を使用すると、例外はなくなりました。

0
user674669