SSL Java.io.IOException:密钥库格式无效
我正在用SSLServerSocket和java.SSL包中的其他类在java中测试SSL。当我运行以下代码时,我得到异常java.io.IOException:Invalid keystore format。我的代码: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
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