2013-03-15 2 views
1

Как настроить приложение Java для использования порта 993 с TLS для чтения писем из почтового ящика IMAP.Как настроить «imaps» для получения писем? JavaMail

Я храню сертификат для своего почтового сервера по умолчанию javakeystore cacerts. После попытки подключения к почтовому ящику. Я получил эту StackTrace (это полный след):

javax.mail.MessagingException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty; 
nested exception is: 
    javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:670) 
    at javax.mail.Service.connect(Service.java:317) 
    at javax.mail.Service.connect(Service.java:176) 
    at javax.mail.Service.connect(Service.java:125) 
    at imap.IMAP.receive(IMAP.java:77) 
    at imap.IMAP.main(IMAP.java:46) 
Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:190) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1764) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1725) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1708) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1237) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1214) 
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:548) 
    at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:352) 
    at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:207) 
    at com.sun.mail.iap.Protocol.<init>(Protocol.java:113) 
    at com.sun.mail.imap.protocol.IMAPProtocol.<init>(IMAPProtocol.java:111) 
    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:637) 
    ... 5 more 
Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 
    at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:57) 
    at sun.security.validator.Validator.getInstance(Validator.java:161) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.java:108) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:204) 
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1185) 
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136) 
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593) 
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:958) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1203) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1230) 
    ... 12 more 
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 
    at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:183) 
    at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:103) 
    at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:87) 
    at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:55) 
    ... 23 more 
15.03.2013 13:54:50 imap.IMAP main 
SCHWERWIEGEND: null 
java.lang.NullPointerException 
    at imap.IMAP.receive(IMAP.java:123) 
    at imap.IMAP.main(IMAP.java:46) 

И это мои proporties:

System.setProperty("javax.net.ssl.trustStore", "/usr/java/jdk_1.6.0_35/jre/lib/security/cacerts"); 
System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); 

Properties props = System.getProperties(); 

props.setProperty("mail.imaps.host", server); 
props.setProperty("mail.imaps.user", user); 
props.setProperty("mail.imaps.password", password); 
props.setProperty("mail.imaps.auth", "true"); 
props.setProperty("mail.imaps.starttls.enable", "true"); 
props.setProperty("mail.imaps.socketFactory.port", "993"); 
props.setProperty("mail.imaps.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
props.setProperty("mail.imaps.socketFactory.fallback", "false"); 

MailAuthenticator auth = new MailAuthenticator(user, password); 

Session session = Session.getDefaultInstance(props, auth); 

store = session.getStore("imaps"); 
store.connect(); 

ли что-то не хватает? В Интернете столько сообщений об этой проблеме. Но больше всего для SMTP. Я не нашел что-то, что действительно объясняет, какие свойства вам действительно нужно, чтобы этот случай работал.

Я надеюсь, что кто-то может помочь мне найти мою ошибку.

Большое спасибо.

ответ

1

Первые несколько замечаний, которые не являются причиной вашей проблемы, но упростит вашу программу ...

избавиться от SocketFactory свойств, вам не нужны.

Используйте Session.getInstance вместо Session.getDefaultInstance.

Избавьтесь от MailAuthenticator и вызовите store.connect (пользователь, пароль).

Подробнее см. В JavaMail FAQ.

Что касается исключения, которое вы получаете, это может быть проблема, связанная с вашим сертификатом или вашим магазином доверия. This JavaMail FAQ entry имеет указатели на советы по отладке этих проблем. Возможно, вам понадобится Java SSL/network/security expert, чтобы объяснить, что не так.

Вы говорите, что уже добавили свой сертификат в свой магазин доверия, но на всякий случай вы можете проверить this JavaMail FAQ entry.

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