Java TLS douille : Pas de certificat de confiance trouvé

Laissez-moi vous expliquer rapidement ce que je suis en train de faire. Je suis en train de construire mon propre Apple Push Notification service en java (pour les tests). Ce service fonctionne grâce à TLS socket.

J'ai un client java pour créer un TLS socket pour envoyer des notifications push à l'Apn. J'ai changé l'hôte de l'url pour rediriger la prise de localhost:2195. Maintenant je suis en train d'écrire un java socket serveur pour obtenir la demande de notification.

Cependant, j'obtiens une exception lors de la poignée de main et ne trouve pas comment le résoudre.

Note : je suis en utilisant le même certificat sur les deux côtés, c'est un standard .fichier p12 qui fonctionne pour envoyer des notifications push à l'Apn.

Ici, c'est le client (simplifié) :

KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new FileInputStream(certificatePath), password.toCharArray());

KeyManagerFactory kmf = KeyManagerFactory.getInstance("sunx509");
kmf.init(ks, password.toCharArray());

TrustManagerFactory tmf = TrustManagerFactory.getInstance("sunx509"); 
tmf.init((KeyStore)null);

SSLContext sc = SSLContext.getInstance("TLS"); 
sc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 

SSLSocketFactory ssf = sc.getSocketFactory(); 
SSLSocket socket = (SSLSocket) ssf.createSocket(InetAddress.getLocalHost(), 2195);
socket.startHandshake();

Voici le serveur :

KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new FileInputStream(certificatePath), password.toCharArray());

KeyManagerFactory kmf = KeyManagerFactory.getInstance("sunx509");
kmf.init(ks, password.toCharArray());

SSLContext context = SSLContext.getInstance("TLS");
context.init(kmf.getKeyManagers(), null, null);

SSLServerSocketFactory ssf = context.getServerSocketFactory();
serverSocket = (SSLServerSocket) ssf.createServerSocket(2195);

Et ici, c'est l'exception :

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found

Je suppose que le client n'est pas de faire confiance au certificat du serveur. J'ai essayé de définir le client est TrustManager à accepter le serveur (p12) et cela a fonctionné, cependant j'ai besoin de ce travail, sans avoir à éditer le client (puisque c'est de travailler de cette façon avec les vrais Apn).

Quel type de certificat doit le serveur pour être approuvé par le client ?

Merci d'avance.

OriginalL'auteur Owumaro | 2014-04-17