我在java中使用SSLServerSocket和java.ssl包中的其他类测试SSL。当我运行以下代码时,我得到异常java.io.IOException:无效的密钥库格式。我的代码:
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();
}
}
}
答案 0 :(得分:8)
您的档案无效。您必须导入JKS密钥库文件而不是txt密钥库文件。您必须使用keytool创建密钥库文件,然后导入此文件。
答案 1 :(得分:8)
我有完全一样的问题。实际上,密钥库文件无效,并且与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文件中,将“过滤”的值更改为“假”。 解决该问题的另一种方法是在application.properties文件中明确指定密钥库的位置。所以代替:
server.ssl.key-store: classpath:keystore.jks
我用过
server.ssl.key-store: keystore/keystore.jks
答案 2 :(得分:5)
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
时,它可以工作。
答案 3 :(得分:0)
我看到了这个例外:
密钥库格式无效
在CentOS 6.6 64位Linux上使用JRE-1.8.0_40运行java应用程序时。
在使用JRE-1.8.0_172时,异常消失了。
答案 4 :(得分:0)
您是如何生成JKS文件的?我尝试了所有建议的解决方案,但没有一个对我有用。尝试读取(在我的代码中)使用OpenJDK Zulu 11的keytool生成的JKS文件时,出现了相同的错误。
我通过使用“ KeyStore Explorer”工具生成JKS文件来解决此问题,我相信该工具在内部使用oracle JDK。使用该工具,我基本上创建了一个JKS文件,并向其中添加了我受信任的证书。
我希望这会有所帮助。