Problème de certificat en SSL

Trekiros -  
 Trekiros -
Bonjour,

Nous sommes deux étudiants, entrain de réaliser un projet universitaire simple : un client pop3 en Java.

Nous avons créé plusieurs adresses mail de test sur des serveurs connus, comme Yahoo et Google.
Voici comment on s'y connecte :
//création de la SSLSocket
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
sslsocket = (SSLSocket) sslsocketfactory.createSocket(host, port);

//paramétrage de la SSLSocket
sslsocket.setUseClientMode(true);

//handshake
sslsocket.startHandshake();

Pour Google, host = "pop.gmail.com" et port = 995
Pour Yahoo, host = "pop.mail.yahoo.com" et port = 995

Dans les deux cas, nous recevons des exceptions lors du handshake.
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Nous avons effectué des recherches sur Internet, pour essayer de mettre à jour le keystore qui contient les certificats acceptés (nous pensons que le nôtre est vide, car si Google n'a pas de certificat de confiance... qui en a ?). Nos recherches ont été peu fructueuses, mais nous avons trouvé cette ligne de code :
System.setProperty("javax.net.ssl.trustStore", "clienttrust");

Qui, si on la place avant la création de la SSLSocketFactory, change l'exception précédente en celle-ci :
javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

Qui semble signifier la même chose. Cependant, la pile d'exécution affichée par printStackTrace pour cette exception est plus courte, donc nous pensons qu'elle a lieu encore plus tôt que pour l'erreur précédente.

Nous sommes un peu perdus, si vous savez comment résoudre ce problème, nous serions heureux de vous écouter.
Merci,
V.Prévost, étudiant à l'U-PEC.
A voir également:

1 réponse

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

"si Google n'a pas de certificat de confiance... qui en a ?"
Google en a un, et toi ?

En vérité le cacerts ne contient pas directement les certificats des différentes sociétés, il va plutôt contenir le certificat de ceux qui attribuent des certificats (GeoTrust dans le cas de Google, Verisign pour Yahoo).

Tu peux afficher la liste des certificats comme ceci (mot de passe: changeit)
cd %JAVA_HOME%\lib\security
keytool -list -keystore cacerts

Donc Java va vous autoriser à vous connecter en https à Google ou Yahoo.

String site = "https://www.google.fr";
Scanner sc = new Scanner(new URL(site).openStream());
while (sc.hasNextLine())
    System.out.println(sc.nextLine());
sc.close();

Mais : je ne parle ici que des certificats utilisés pour les sites web en https, c'est à dire que Google est le serveur et Java le client qui vérifie que Google est sécurisé.
Mais pour le pop3 c'est l'inverse, Java devient le "serveur" et c'est Google le client qui va vérifier que ton programme utilise est certifié pour le SSL.

https://support.google.com/mail/answer/21289?visit_id=637167273351388166-2526098193&rd=1

Mais comme toi tu n'as pas ton propre certificat reconnu par Google, c'est Google qui t'enverra un refus, que Java transformera en exception.
Même si dans ton cas, Java t'envoie une exception dès le départ car sans chercher à se connecter à Google, tu n'es même pas reconnu par Java...

La "solution" est de ne pas faire de SSL, donc configurer le compte Google pour communiquer en pop3 non sécurisé, et adapter le Java pour faire de la communication simple en clair.
1
Trekiros
 
Je vois je vois, en effet ça va être un problème. Très bonne explication en tout cas, merci beaucoup !

On n'a pas trouvé l'option pour passer notre compte gmail en mode non sécurisé, ni celui sur Yahoo. Pour Yahoo, ils disent qu'ils ont retiré l'option à cause des différents leaks des dernières années. Ca serait la faute à Edward Snowden.

On a aussi essayé avec un nouveau compte, mais l'option n'est pas là pendant l'inscription non plus.

Les certificats SSL sont payants donc... Nous pensons utiliser un serveur pop3 sans SSL open source et se connecter à localhost pour la démonstration, du coup. Si vous avez une autre idée, on prend !
0