Java javax.net.le protocole ssl.SSLPeerUnverifiedException: peer pas authentifié
J'essaie de me connecter à mon propre Serveur SSL avec mon propre Client SSL, mais j'obtiens l'erreur suivante:
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at sun.security.ssl.SSLSessionImpl.getPeerCertificateChain(SSLSessionImpl.java:420)
at server.run(Server.java:70)
at server.main(Server.java:22)
J'ai cherché pour le même problème ici sur stackoverflow mais je ne peux que trouver des gens qui l'utilisent en sont dans Apache ou autres HTTPS "systèmes".
Voici mon code serveur:
/* Server SSL */
import javax.net.ssl.*;
import java.io.*;
import java.net.InetAddress;
import java.security.KeyStore;
//import java.security.cert.X509Certificate;
import java.util.Date;
import javax.security.cert.X509Certificate;
class server {
ObjectOutputStream out;
ObjectInputStream in;
public static void main(String[] args) {
new server().run();
}
void run() {
Date date = new Date();
try {
//Security test (to avoid starting from the command line)c
char[] passphrase = "password".toCharArray();
KeyStore keystore = KeyStore.getInstance("JKS");
keystore.load(new FileInputStream("/home/ME/CERT/keystore"), passphrase);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(keystore, passphrase);
SSLContext context = SSLContext.getInstance("TLS");
KeyManager[] keyManagers = kmf.getKeyManagers();
context.init(keyManagers, null, null);
//-- End of security test
//1. Create a server Socket
SSLServerSocketFactory sslserversocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
SSLServerSocket sslserversocket = (SSLServerSocket) sslserversocketfactory.createServerSocket(9999);
//TBH im not sure what the following code does, but I need it?
String[] enabledCipherSuites = { "SSL_DH_anon_WITH_RC4_128_MD5" };
sslserversocket.setEnabledCipherSuites(enabledCipherSuites);
//2. Wait for connection.
System.out.println("Waiting for connection. ");
SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();
SSLSession session = sslsocket.getSession();
X509Certificate cert = (X509Certificate)session.getPeerCertificateChain()[0];
String subject = cert.getSubjectDN().getName();
System.out.println(subject);
//2.1 Prints information about client, this could be (very) valuable to save in a file.
System.out.println("Connection received: ");
System.out.println(" Hostname: " + sslsocket.getInetAddress().getHostName());
sslsocket.getInetAddress();
System.out.println(" IP: " + InetAddress.getLocalHost().getHostAddress());
System.out.println(" @ " + date.toString());
System.out.println();
//3. Create input and output streams.
//for some reason i cant make the out/in-variable without using it as global?
out = new ObjectOutputStream(sslsocket.getOutputStream());
out.flush();
in = new ObjectInputStream(sslsocket.getInputStream());
sendMessage("Connection successful");
//4. Client and server talks via the input and output streams
String message;
do {
message = (String)in.readObject();
System.out.println(" Client says: " + message);
if (message.equals("bye")) {
sendMessage("bye");
}
}while(!message.equals("bye"));
//5. Closing connection
in.close();
out.close();
sslsocket.close();
System.out.println("Server terminated. ");
} catch (Exception exception) {
exception.printStackTrace();
}
}
void sendMessage(String msg) throws Exception
{
out.writeObject(msg);
out.flush();
System.out.println(" You(server) says: " + msg);
}
}
Et voici mon code Client:
/* Java SSL Client */
import javax.net.ssl.*;
import java.io.*;
import java.security.KeyStore;
import java.util.*;
class client {
String message;
ObjectOutputStream out;
ObjectInputStream in;
public static void main(String[] args) {
new client().run();
}
void run() {
System.out.println();
int port = 9999;
String host = "127.0.0.1";
try {
//Security test (to avoid starting with the command line)
char[] passphrase = "trustword".toCharArray();
KeyStore keystore = KeyStore.getInstance("JKS");
keystore.load(new FileInputStream("/home/ME/CERT/truststore"), passphrase);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(keystore);
SSLContext context = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = tmf.getTrustManagers();
context.init(null, trustManagers, null);
//--- End of security test
System.out.println("Connecting to " + host + " on port " + port);
//1. Create a client socket.
SSLSocketFactory sslFactory = (SSLSocketFactory)SSLSocketFactory.getDefault();
SSLSocket sslSocket = (SSLSocket)sslFactory.createSocket(host, port);
//TBH im not sure what the following code does, but I need it?
String[] enabledCipherSuites = { "SSL_DH_anon_WITH_RC4_128_MD5" };
sslSocket.setEnabledCipherSuites(enabledCipherSuites);
System.out.println("Connected.");
//2. Create input and output streams
out = new ObjectOutputStream(sslSocket.getOutputStream());
out.flush();
in = new ObjectInputStream(sslSocket.getInputStream());
//3. Client and server talks via the input and output streams
Scanner input = new Scanner(System.in);
message = (String)in.readObject();
System.out.println(" Server says: " + message);
sendMessage("Hello Server! ");
do {
//Sends input text
System.out.print("Enter text to send: ");
message = input.nextLine();
sendMessage(message);
if (message.equals("bye")) {
message = (String)in.readObject();
System.out.println(" Server says: " + message);
}
} while(!message.equals("bye"));
//4. Closing connection
in.close();
out.close();
sslSocket.close();
System.out.println("Client terminated. ");
}
catch (Exception exception) {
exception.printStackTrace();
}
}
void sendMessage(String msg) throws Exception
{
out.writeObject(msg);
out.flush();
System.out.println(" You(client) says: " + msg);
}
}
Je suis profondément reconnaissant une réponse, ou un coup de pouce dans la bonne direction!
OriginalL'auteur phiip | 2012-02-27
Vous devez vous connecter pour publier un commentaire.
Il y a deux problèmes ici.
Vous êtes limitant les suites de chiffrement à SSL_DH_anon_WITH_RC4_128_MD5, qui est un anonyme de la suite de chiffrement, donc il n'y a pas d'authentification. Juste à l'enlever, vous n'en avez pas besoin.
Vous n'êtes pas à l'appel de
setWantClientAuth(true)
ousetNeedClientAuth(true)
au serveur, le client n'est jamais invité à envoyer son certificat, donc ce n'est pas l'envoi d'un. Afin d'avoir le serveur de demander le certificat homologue est inutile. Ont la client demander.À ce stade, vous devez décider si vous avez vraiment besoin de l'authentification du client ou non. Si vous le faites, vous devez appeler l'une des méthodes ci-dessus, et vous devez fournir le client avec une clé privée et un certificat signé dans un magasin de clés, et de faire en sorte que le serveur est truststore fiducies de ce fichier de clés, soit par l'exportation/l'importation ou le client certificat signé par une autorité de certification. Il n'est pas immédiatement clair que vous avez besoin de tout cela.
1. si vous souhaitez que le certificat homologue, le pair a l'envoyer, et si l'hôte est le client que vous avez envie ou besoin de l'authentification du client pour que cela se produise. 2. L'exception relative à la suite de chiffrement signifie qu'il y a quelque chose de très étrange à propos de votre certificat de serveur. Générer une nouvelle clé privée à l'aide de RSA et recommencer avec le processus de signature.
Bien sûr, vous devez le supprimer de la suite de chiffrement de réglage des deux côtés, à la fois le serveur et le client.
OriginalL'auteur user207421
Certificat expiré a été la cause de notre "javax.net.le protocole ssl.SSLPeerUnverifiedException: peer pas authentifié".
OriginalL'auteur buzz3791