2011-02-04 89 views
18

当我使用imaps连接到我的imap服务器时,它失败。如何忽略javamail中的服务器证书错误

你能告诉我如何在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 

忽略服务器证书错误,我的源代码

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

可能的重复http://stackoverflow.com/questions/4062307/pkix-path-building-failed-unable-to-find-valid-certification-path-to-requested-t – Raghuram 2011-02-04 05:49:58

回答

43

使用prop.put("mail.imaps.ssl.trust", "*");,因为你正在使用imaps店。

smtp你可以试试: prop.put("mail.smtp.ssl.trust", "*");

4

如果您使用的是javamail 1.4.2+,则可以使用一个套接字工厂来忽略服务器证书。

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

为什么要打扰SSL,如果你无论如何都愿意相信所有的主机......不要在生产中使用它。 – Bruno 2012-01-05 09:59:39

+0

我同意我们不应该在生产中使用它。这通常用于自签名证书。连接到测试使用自签名证书的imaps服务器时,我遇到了同样的问题。这为我修好了。 – 2012-01-05 23:52:24

28

不要忽略证书验证错误(除非可能在测试环境中):这违背了使用SSL/TLS的要点。例如,如果您知道您信任该服务器证书,请将其导入您的信任存储(JRE的全局信任存储或您使用javax.net.ssl.trustStore*系统属性指定的本地信任存储)。

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

上述变化将修复javax.mail.MessagingException: Could not connect to SMTP host: hostname, port: 465;的嵌套异常

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

我同样的问题,使用

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

com.sun.mail.util.MailSSLSocketFactory

其作品!!

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:JavaMail的版本1.4.5
Exchange Server 2010的
PlainTextLogin
http://technet.microsoft.com/ru-ru/library/bb124498(v=exchg.141).aspx

0

这将帮助你绕过认证过程,并直接得到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

我认为@布鲁诺对admoni是正确的SH你不要盲目地相信所有服务器的黑客setTrustAllHosts(true)

在他们演示如何将开发邮件主机添加到信任列表而不迫使您的应用程序不安全相信全世界的docs at Oracle

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

我是同样的问题。

MailSSLSocketFactory socketFactory = new MailSSLSocketFactory(); socketFactory。setTrustedHosts(new String [] {“my-server”});

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

它的作品!

1

如果问题仍然存在于Java 6中,那么解决方案很简单。它与Java 7的发布一样简单。在machine.java 7中安装java 7具有能够忽略证书认证的证书文件。

复制 “的cacerts” 文件从下面的Java 7的目录

C:\ Program Files文件\的Java \ jdk1.7.0_79 \ JRE \ lib \ security中

并粘贴在

C:\ Program Files文件\的Java \ jdk1.6.0 \ JRE \ lib \ security中

现在证书认证问题将得到解决。