Problème de certificat en SSL
Trekiros
-
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 :
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.
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 :
Qui, si on la place avant la création de la SSLSocketFactory, change l'exception précédente en celle-ci :
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.
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:
- Java impossible de valider le certificat
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Ethernet n'a pas de configuration ip valide - Guide
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
1 réponse
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)
Donc Java va vous autoriser à vous connecter en https à Google ou Yahoo.
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.
"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.
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 !