Laissez-moi vous expliquer rapidement ce que j'essaie de faire. J'essaie de créer le service de notification push de mon propre Apple en Java (à des fins de test). Ce service fonctionne grâce à la prise TLS.Socket Java TLS: aucun certificat de confiance trouvé
J'ai un client java pour créer un socket TLS pour envoyer des notifications push aux APN. J'ai changé l'URL de l'hôte pour rediriger le socket vers localhost: 2195. Maintenant j'essaye d'écrire un serveur de douille de java pour obtenir la demande de notification. Cependant, je reçois une exception lors de l'établissement de la liaison et je n'arrive pas à résoudre le problème.
Remarque: J'utilise le même certificat des deux côtés, c'est un fichier .p12 standard qui fonctionne pour envoyer des notifications push aux APN.
Voici 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 voici l'exception:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
Je suppose que le client n » t faire confiance au certificat du serveur. J'ai essayé de configurer TrustManager du client pour accepter le p12 du serveur et cela a fonctionné, cependant j'ai besoin que cela fonctionne sans éditer le client (puisqu'il fonctionne de cette façon avec les vrais APNs).
Quel type de certificat nécessite la confiance du serveur par le client?
Merci d'avance.
Je voudrais également utiliser TrustManagerFactory.getInstance (TrustManagerFactory.getDefaultAlgorithm()) '(d'autant plus que c'est' PKIX' par défaut, pas 'SunX509'). – Bruno