Java SSL java.io.IOException: invalid keystore format

I am testing SSL in Java using SSLServerSocket and other classes in java.ssl package. When I run the following code, I get java.io.IOException exception: Invalid key store format. My code is:

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 file: 1268312345812304612348712634283427346 I assume that I have to put something else in the key.txt file, but I don’t know what to add to it. Probably the object is lit.

EDIT: Customer Code:

 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(); } } } 
+5
source share
2 answers

Invalid file. You need to import the JKS repository file, not txt. You must use keytool to create a keystore file and then import this file.

+6
source

I ran into the same problem when load keystore with the following code:

 KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); Resource resource = new ClassPathResource(file); trustStore.load(resource.getInputStream(), password.toCharArray()); 

It turned out that this is a JDK problem, it does not work with jre1.8.0_25 . when I upgrade the JDK version to the latest jre1.8.0_121 version, it works.

0
source

Source: https://habr.com/ru/post/1203525/


All Articles