SSL Java java.io.IOException: Invalid format de fichier de clés
Je suis en train de tester le protocole SSL en java avec SSLServerSocket et d'autres classes en java.ssl paquet. Lorsque j'exécute le code suivant, je reçois l'exception java.io.IOException: Invalid format de fichier de clés. Mon code:
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();
}
}
}
Fichier key.txt:
1268312345812304612348712634283427346
Je devine que je devrais mettre quelque chose d'autre dans la key.txt fichier, mais je ne sais pas quoi mettre dedans. Probablement un searilized objet.
EDIT: Code Client:
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();
}
}
}
Un fichier de magasin de clés n'est pas un fichier texte.
En fait la clé n'est pas un magasin de clés; un fichier texte n'est pas un magasin de clés; et les clés ne peuvent pas être stockées dans un fichier texte.
En fait la clé n'est pas un magasin de clés; un fichier texte n'est pas un magasin de clés; et les clés ne peuvent pas être stockées dans un fichier texte.
OriginalL'auteur Java Is Cool | 2014-09-27
Vous devez vous connecter pour publier un commentaire.
Votre fichier n'est pas valide. Vous devez importer un JKS fichier de magasin de clés et pas un txt. Vous devez utiliser le keytool pour créer votre fichier de magasin de clés et ensuite importer ce fichier.
Cela dépend des types de fichier de vos clés sont stockées. Des exemples peuvent être trouvés ici. Si vous avez des questions ou des problèmes, n'hésitez pas à demander.
Je suis en supposant que vous avez pas ajouté le certificat du serveur vers le client. Envoyer le code pour la connexion du client.
J'ai changé mon client (et le serveur) et le code maintenant obtenir de l'exception suivante sur le client:
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No X509TrustManager implementation available
Caused by: java.security.cert.CertificateException: No X509TrustManager implementation available
C'est une nouvelle question, mais vous avez spécifié un tableau vide de
TrustManagers
lors de l'initialisation de votreSSLContext,
n'avez-vous pas, alors, évidemment, il n'y a pasTrustManagers
disponibles.OriginalL'auteur VGe0rge
J'ai eu exactement le même problème. En effet, le fichier de magasin de clés était pas valide et ne sont pas liées à la JDK//version du JRE. Le problème dans mon cas a été causé par Maven. J'ai été en utilisant l'option suivante dans mon fichier pom:
La valeur "true" dans le filtrage a été de jouer avec le fichier de clé. Par conséquent, le fichier qui était disponible dans mon classpath lors du Printemps n'était pas exactement la même que j'ai sous mon répertoire "src/main/resources" et qui a provoqué l'Invalide Format Keystore exception. Quand je l'ai testé avec keytool j'étais en utilisant l'un, sous la rubrique "ressources" dossier de manière trompeuse la vraie question.
La résolution de la question: dans votre pom.xml fichier, modifiez la valeur de "filtrage" à "false".
Une autre façon de résoudre le problème qui a été pour spécifier explicitement l'emplacement du fichier de stockage des clés dans l'application.fichier de propriétés. Ainsi, au lieu de:
J'ai utilisé
trouvaille intéressante. merci vm.
Cette exactement fixé mon problème!, merci
OriginalL'auteur acaruci
Je pose le même problème lors de l'
load keystore
avec le code suivant:Il s'est avéré être le JDK problème, il ne fonctionne pas avec
jre1.8.0_25
. quand je l'ai mise à niveau VERS la version la plus récentejre1.8.0_121
, il fonctionne.Pas 1.8.0_66, j'ai fait une erreur, c'est ma version du JDK. Il ne fonctionne pas sur mon collègue jre1.8.0_25, relativement plus faible que 66 ou la dernière, réinstallez le JDK est ok, vous pouvez essayer.
J'ai rencontré le même problème, échoue avec JDK 1.8.0_45, fonctionne très bien avec le JDK 1.8.0_131
yep, même pour moi. Il apparaît également lorsque vous utilisez le panneau images de ibmjava vs l'openjdk. Ne savez pas quelle version exactement l'origine du problème, mais il est très probable qu'elle est causée par la version du JDK.
OriginalL'auteur Dave Pateral
J'ai vu cette exception:
Invalide format keystore
lors de l'exécution d'une application java à l'aide JRE-1.8.0_40 sur CentOS 6.6 linux 64-bit.
Sur l'utilisation de JRE-1.8.0_172, l'exception s'en alla.
OriginalL'auteur user674669