2011-02-04 10 views
18

quando mi collego al mio server imap utilizzando imap, fallisce.come ignorare l'errore cert del server in javamail

mi puoi dire come ignorare errore del server cert in 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 

e il mio codice sorgente

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", "[email protected]"); 
System.out.println(store.getFolder("INBOX").getMessageCount()); 
+0

Possibile duplicato di http://stackoverflow.com/questions/4062307/pkix-path-building-failed-unable-to-find-valid-certification-path-to-requested-t – Raghuram

risposta

43

uso prop.put("mail.imaps.ssl.trust", "*"); dal momento che si sta utilizzando imaps negozio.

e per smtp si può provare: prop.put("mail.smtp.ssl.trust", "*");.

4

Se si utilizza javamail 1.4.2+, è disponibile un factory di socket che è possibile utilizzare per ignorare il certificato del server.

MailSSLSocketFactory socketFactory= new MailSSLSocketFactory(); 
socketFactory.setTrustAllHosts(true); 
prop.put("mail.imap.ssl.socketFactory", socketFactory); 
+6

Perché preoccuparsi di SSL se si Sono disposto a fidarsi comunque di tutti gli ospiti ... Non usarlo in produzione. – Bruno

+0

Sono d'accordo che non dovremmo mai usarlo in produzione. Questo di solito è per un certificato autofirmato. Ho avuto lo stesso problema per la connessione al test del server imaps che utilizza un certificato autofirmato. Questo l'ha risolto per me. –

+0

Grazie, avevo bisogno di questo per connettersi a Gmail su IMAP come parte di un framework di test funzionale. –

28

Non ignorare errori di verifica del certificato (se non forse in un ambiente di test): questo sconfigge il punto di usare SSL/TLS.

Invece, se si sa che vi fidate certificato del server, importare nel tuo negozio di fiducia (o il negozio di fiducia globale del JRE o di un locale che si specifica con le proprietà di sistema javax.net.ssl.trustStore*, per esempio).

+7

Ahh, StackOverflow: dove le risposte sicure alle domande sulla sicurezza vengono downvoted e le risposte non sicure vengono svalutate. Sigh .... –

+0

Questa è una grande risposta. Cosa succede se stai utilizzando un codice di terze parti? Non puoi usare nessun hack sporco presentato in altre risposte. Questo ha funzionato, ma potrebbe essere più specifico su come aggiungere il certificato. Ciò che mi ha aiutato in questo, è stato rendermi conto che dovevo cambiare jre/lib/security/cacerts, usando questo consiglio: http://www.martin-probst.com/blog/2008/03/14/installing-importing-a -root-certificate-in-java/In breve: usa 'keytool -import -file your_cert.cer/path/to/cacerts', la password è * changeit *. –

+0

Considerate le limitazioni delle CA single-rooted commerciali di terze parti, niente di meno di un trust store la cui unica CA è te stessa non è completa. Essendo il punto, per le applicazioni web multi-tenant in cui l'endpoint remoto è desiderato dal cliente indipendentemente dal fatto che abbiano pagato per un certificato commerciale, il rischio MITM è spesso ritenuto accettabile per endpoint ben definiti. – LateralFractal

3
 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", "*"); 

modifiche di cui sopra risolverà javax.mail.MessagingException: Could not connect to SMTP host: hostname, port: 465; per l'eccezione annidata

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 
1

ero lo stesso problema, utilizzando

MailSSLSocketFactory socketFactory= new MailSSLSocketFactory(); 
socketFactory.setTrustAllHosts(true); 
prop.put("mail.pop3s.ssl.socketFactory", socketFactory); 

com.sun.mail.util.MailSSLSocketFactory

le sue opere!!

0
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:[email protected]: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: versione JavaMail Server 1.4.5
Exchange 2010
PlainTextLogin
http://technet.microsoft.com/ru-ru/library/bb124498(v=exchg.141).aspx

0

Questo vi aiuterà a ignorare processo certificato e arriva direttamente alla serie SSL

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 
} 
2

Penso che @Bruno sia corretto per admoni sh di non fidarsi ciecamente tutti i server con l'hack setTrustAllHosts(true)

Nel docs at Oracle mostrano come aggiungere il tuo host di posta dev per l'elenco di fiducia senza forzare la vostra applicazione di fiducia non sicuro il mondo intero:

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); 
0

Ero lo stesso problema.

MailSSLSocketFactory socketFactory = new MailSSLSocketFactory(); socketFactory.setTrustedHosts (new String [] {"my-server"});

socketFactory.setTrustAllHosts (true); props.put ("mail.smtps.socketFactory", socketFactory);

funziona!

1

Se il problema persiste in Java 6, la soluzione è semplice. È semplice come Java 7 è stato rilasciato. Installare java 7 in machine.java 7 ha il file dei certificati che ha la capacità di ignorare l'autenticazione del certificato.

copiare il file "cacerts" dal seguire Java 7 directory

C: \ Program Files \ Java \ jdk1.7.0_79 \ jre \ lib \ security

e incollarlo nella

C: \ Program Files \ Java \ jdk1.6.0 \ jre \ lib \ security

ora verrà risolto il problema dell'autenticazione del certificato.