gpt4 book ai didi

java - SSL Java java.io.IOException : Invalid keystore format

转载 作者:搜寻专家 更新时间:2023-10-30 21:40:54 24 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

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

我用过

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

关于java - SSL Java java.io.IOException : Invalid keystore format,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26071429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com