SSL Java java.io.IOException:无效的密钥库格式

新手上路,请多包涵

我正在使用 SSLServerSocket 和 java.ssl 包中的其他类在 Java 中测试 SSL。当我运行以下代码时,出现异常 java.io.IOException: Invalid keystore format。我的代码:

 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();
        }
    }
}

原文由 Java Is Cool 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 708
2 个回答

您的文件无效。您必须导入 JKS 密钥库文件而不是 txt 文件。您必须使用 keytool 创建密钥库文件,然后导入该文件。

原文由 VGe0rge 发布,翻译遵循 CC BY-SA 3.0 许可协议

我有完全相同的问题。事实上,密钥库文件是无效的,与 JDK//JRE 版本无关。我的问题是由 Maven 引起的。我在我的 pom 文件中使用了以下选项:

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

过滤中的“真”值弄乱了密钥文件。因此,当 Spring 运行时我的类路径中可用的密钥文件与我在目录“src/main/resources”下的密钥文件不完全相同,这导致了无效密钥库格式异常。当我使用 keytool 进行测试时,我使用的是“资源”文件夹下的那个,所以这误导了真正的问题。

解决问题:在您的 pom.xml 文件中,将“filtering”的值更改为“false”。解决该问题的另一种方法是在 application.properties 文件中明确指定密钥库的位置。所以不是:

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

我用了

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

原文由 acaruci 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题