comment ignorer l'erreur cert du serveur dans javamail
quand je me connecte à mon serveur imap en utilisant imaps,il échoue.
pouvez-vous me dire comment ignorer l'erreur cert du serveur dans javamail
Exception in thread "main"
javax.mail.MessagingException:
sun.security.validator.ValidatorException:
PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification
path to requested target; nested
exception is:
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 at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:665)
at javax.mail.Service.connect(Service.java:295)
at javax.mail.Service.connect(Service.java:176)
at App20110204.main(App20110204.java:31)
Caused by:
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 at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1623)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:198)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:192)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1074)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:128)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:529)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:465)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1120)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1147)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1131)
at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:507)
at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238)
at com.sun.mail.iap.Protocol.<init>(Protocol.java:113)
at com.sun.mail.imap.protocol.IMAPProtocol.<init>(IMAPProtocol.java:110)
at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:632)
... 3 more Caused by:
sun.security.validator.ValidatorException:
PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification
path to requested target at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:294)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:200)
at sun.security.validator.Validator.validate(Validator.java:218)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1053)
... 15 more Caused by:
sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification
path to requested target at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:289)
... 21 more
et mon code source
Properties prop = new Properties();
prop.put("mail.imap.ssl.checkserveridentity", "false");
prop.put("mail.imap.ssl.trust", "*");
Session session = Session.getDefaultInstance(prop);
Store store = session.getStore("imaps");
store.connect("mail.xxx.com", "xxxx", "p@ssw0rd");
System.out.println(store.getFolder("INBOX").getMessageCount());
10 réponses
utiliser prop.put("mail.imaps.ssl.trust", "*");
puisque vous utilisez imaps
magasin.
et smtp
vous pouvez essayer :
prop.put("mail.smtp.ssl.trust", "*");
.
Ne pas ignorer les erreurs de vérification de certificat (sauf peut-être dans un environnement de test): cela va à l'encontre de L'utilisation de SSL/TLS.
au lieu de cela, si vous savez que vous faites confiance à ce certificat de serveur, importez-le dans votre magasin de confiance (soit le magasin de confiance global de la JRE ou un local que vous spécifiez avec le javax.net.ssl.trustStore*
propriétés système, par exemple).
si vous utilisez javamail 1.4.2+, il y a une usine de socket que vous pouvez utiliser pour ignorer le certificat du serveur.
MailSSLSocketFactory socketFactory= new MailSSLSocketFactory();
socketFactory.setTrustAllHosts(true);
prop.put("mail.imap.ssl.socketFactory", socketFactory);
Properties propsSSL = new Properties();
propsSSL.put("mail.transport.protocol", "smtps");
propsSSL.put("mail.smtps.host", "hostname");
propsSSL.put("mail.smtps.auth", "true");
propsSSL.put("mail.smtps.ssl.checkserveridentity", "false");
propsSSL.put("mail.smtps.ssl.trust", "*");
les modifications ci-dessus corrigeront javax.mail.MessagingException: Could not connect to SMTP host: hostname, port: 465;
pour l'exception imbriquée
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
exception
je pense que @ Bruno est correct de vous exhorter à ne pas faire confiance aveuglément à tous les serveurs avec le hack setTrustAllHosts(true)
Dans le docs à Oracle ils montrent comment ajouter votre hôte de messagerie dev à la liste de confiance sans forcer votre application à faire confiance au monde entier:
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustedHosts(new String[] { "my-server" });
props.put("mail.smtp.ssl.enable", "true");
// also use following for additional safety
props.put("mail.smtp.ssl.checkserveridentity", "true");
props.put("mail.smtp.ssl.socketFactory", sf);
j'ai été sur le même sujet, à l'aide de
MailSSLSocketFactory socketFactory= new MailSSLSocketFactory();
socketFactory.setTrustAllHosts(true);
prop.put("mail.pop3s.ssl.socketFactory", socketFactory);
com.soleil.courrier.util.MailSSLSocketFactory
ça fonctionne!!
si C'est le problème qui persiste en Java 6, alors la solution est simple.C'est juste que Java 7 est sorti.Installer java 7 dans machine.java 7 a le fichier de certificats ayant la capacité d'ignorer l'authentification du certificat.
copier le fichier" cacerts " du répertoire java 7 suivant
C:\Program fichiers\Java\jdk1.7.0_79\jre\lib\security
et le coller dans
C:\Program Fichiers\Java\jdk1.6.0\jre\lib\security
maintenant le problème d'authentification du certificat sera résolu.
Properties pr = new Properties();
MailSSLSocketFactory socketFactory= new MailSSLSocketFactory();
socketFactory.setTrustAllHosts(true);
pr.put("mail.pop3s.ssl.socketFactory", socketFactory);
Session ses = Session.getInstance(pr);
ses.setDebug(true);
URLName url = new URLName("pop3s://username:password@host:posrt");
Store store = ses.getStore(url.getProtocol());
store.connect(url.getHost(), url.getPort(), url.getUsername(), url.getPassword());
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
try {
int i = inbox.getMessageCount();
com.sun.mail.pop3.POP3Message mes;
while (i > 0) {
mes = (com.sun.mail.pop3.POP3Message) inbox.getMessage(i);
System.out.println(mes.getContentID());
i--;
}
} finally {
inbox.close(false);
store.close();
}
DEBUG: setDebug: JavaMail version 1.4.5
Exchange server 2010
PlainTextLogin
http://technet.microsoft.com/ru-ru/library/bb124498(v=exchg.141).aspx
cela vous aidera à contourner le processus de certificat et à accéder directement à ssl host
MailSSLSocketFactory sf = null;
try
{
sf = new MailSSLSocketFactory();
}
catch (GeneralSecurityException e)
{
e.printStackTrace();
}
sf.setTrustAllHosts(true);
Properties pop3Props = new Properties();
pop3Props.setProperty("mail.pop3.ssl.enable", "true");
pop3Props.setProperty("mail.protocol.ssl.trust", "pop3.live.com");
pop3Props.put("mail.pop3s.ssl.socketFactory", sf);
pop3Props.setProperty("mail.pop3s.port", "995");
Session session = Session.getInstance(pop3Props);
try
{
/* Get a Store object*/
Store store = session.getStore("pop3s");
//process further activity
}
j'étais le même problème.
MailSSLSocketFactory socketFactory = new MailSSLSocketFactory(); socketFactory.setTrustedHosts(new String[] { "mon serveur"});
socketFactory.setTrustAllHosts (true); accessoires de jeu.put("mail.SMTP.socketFactory", socketFactory);
ça fonctionne!!