2011-02-04 3 views
18

Когда я подключаюсь к моему IMAP-серверу с помощью imaps, он не работает.как игнорировать ошибку сертификата сервера в javamail

вы можете сказать мне, как игнорировать ошибку сервера Cert в 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

ответ

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

+0

Я согласен, что мы никогда не должны использовать это в производстве. Это обычно для самозаверяющего сертификата. У меня такая же проблема для подключения к тестированию сервера imaps, который использует самозаверяющий сертификат. Это исправило это для меня. –

+0

Спасибо, мне нужно было это, чтобы подключиться к Gmail через IMAP как часть функциональной тестовой среды. –

28

Не игнорировать ошибки проверки сертификатов (если возможно, в тестовой среде): это не побеждает точку с помощью SSL/TLS.

Вместо этого, если вы знаете, что доверяете этому сертификату сервера, импортируйте его в хранилище доверия (например, глобальное хранилище доверия JRE или локальное, указанное вами с помощью системных свойств javax.net.ssl.trustStore*).

+7

Ahh, StackOverflow: где безопасные ответы на вопросы об обеспечении безопасности снижаются, а небезопасные ответы сохраняются. Вздох .... –

+0

Это отличный ответ. Что делать, если вы используете сторонний код? Вы не можете использовать любые грязные хаки, представленные в других ответах. Это работало, но может быть более конкретным, как добавить сертификат. Что помогло мне в этом, было понять, что мне пришлось изменить jre/lib/security/cacerts, используя этот совет: http://www.martin-probst.com/blog/2008/03/14/installing-importing-a -root-certificate-in-java/Короче: используйте 'keytool -import -file your_cert.cer/path/to/cacerts', пароль - * changeit *. –

+0

Учитывая ограничения сторонних коммерческих одиночных корневых центров сертификации, все, что меньше, чем хранилище доверия, единственным СА которого является самим собой, является неполным. В настоящее время для многопользовательских веб-приложений, где клиенту требуется удаленная конечная точка, независимо от того, заплатили ли они за коммерческий сертификат, риск MITM часто считается приемлемым для четко определенных конечных точек. – 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", "*"); 

Изменения будут исправить 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

Это поможет вам обойти процесс сертификации и получить непосредственно ССЛ хозяина

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

Я думаю, @Bruno является правильным для admoni ш вы не слепо доверять всем серверам с хака setTrustAllHosts(true)

В docs at Oracle они показывают, как добавить свой Dev почтовый хост в список доверенных, не заставляя приложение небезопасным доверять всему миру:

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 = новый MailSSLSocketFactory(); гнездоFactory.setTrustedHosts (новый String [] {"my-server"});

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

это работа !!

1

Если это проблема, которая сохраняется в Java 6, тогда решение прост. Это просто, поскольку была выпущена Java 7. Установка java 7 в machine.java 7 имеет файл сертификатов, имеющий возможность игнорировать аутентификацию сертификата.

скопировать "cacerts" файл из следующих Java 7 директории

C: \ Program Files \ Java \ jdk1.7.0_79 \ JRE \ Lib \ безопасность

и вставить его в

C: \ Program Files \ Java \ jdk1.6.0 \ JRE \ Lib \ безопасность

проблема разрешения подлинности сертификата будет решена.

Смежные вопросы