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

SSL Java.io.IOException:密钥库格式无效,java,security,ssl,Java,Security,Ssl,我正在用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.InputStreamReade

我正在用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();
        }
    }
}

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

使用以下代码加载密钥存储库时,我遇到了相同的问题:

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时,它工作正常。

我看到了这个异常:

无效的密钥库格式

在CentOS 6.6 64位linux上使用JRE-1.8.040运行java应用程序时


在使用JRE-1.8.0_172时,异常消失了。

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

<resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
我曾经

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

您是如何生成JKS文件的?我尝试了所有建议的解决方案,但没有一个对我有效。当我试图读取(在我的代码中)使用OpenJDK Zulu 11的keytool生成的JKS文件时,我遇到了相同的错误

我改为使用“KeystoreExplorer”工具生成JKS文件,修复了这个问题,我相信它在内部使用了OracleJDK。使用该工具,我基本上创建了一个JKS文件,并向其中添加了我的可信证书


我希望这会有所帮助。

密钥库文件不是文本文件。实际上,密钥不是密钥存储;文本文件不是密钥存储;密钥不能存储在文本文件中。这取决于密钥存储的文件类型。可以找到一些例子。如果您有任何问题,请随时提问。我假设您尚未将服务器的证书添加到客户端。发送客户端连接的代码。我更改了客户端(和服务器)编码并在客户端上获得以下异常:
javax.net.ssl.SSLHandshakeException:java.security.cert.certificateeexception:No X509TrustManager实现可用
原因:java.security.cert.certificateeexception:No X509TrustManager实现可用
@JavaIsCool这是一个新问题,但是您在初始化
SSLContext时指定了一个空的
TrustManagers数组,
不是吗,所以当然没有可用的
TrustManagers
。@VGe0rge如何使用keytool命令生成证书链?没有这样的问题。你改变了一些别的东西。当我看到“低版本JDK”时,我以为你指的是1.2.2。1.8.0_66很难“低”。不是1.8.0_66,我犯了一个错误,它是我的JDK版本。它在我同事的jre1.8.0_25上不起作用,相对低于66或最新版本,重新安装JDK是可以的,你可以试试。我遇到了同样的问题,JDK 1.8.0_45失败,在JDK 1.8.0_131; 131p上工作正常,对我来说也是。当使用ibmjava与openjdk的docker图像时,它也会出现。不确定到底是哪个版本导致了问题,但很可能是JDK版本造成的。谢谢!这不是我的问题,但它帮助我解决了我的问题。我用我的IDE一次又一次地“热”构建(好几天),这个问题似乎是随机发生的。你的回答让我想到做一个合法的maven构建,这让下一个部署能够工作:)。非常感谢!我花了一整天的时间在这个问题上,试图让卡夫卡在我的Spring应用程序中工作。你是救命恩人。你终于用上了密钥库浏览器?
server.ssl.key-store: keystore/keystore.jks