2016-01-13 100 views
3

我試圖通過Java郵件API連接到使用StartTLS和自簽名證書的郵件服務器。 而這似乎是一個問題,因爲我找不到任何方法來爲StartTLS設置已接受的證書或信任庫。將Java Mail StartTLS與Truststore結合使用

Properties props = new Properties(); 
props.put("mail.imap.starttls.enable", "true"); 
props.put("mail.imap.starttls.required", "true"); 
Session session = Session.getInstance(props); 
Store store = session.getStore("imap"); 
store.connect(hostName, port, userName, userPassword); 

當我作爲運行我的應用程序,我得到這個PKIX路徑錯誤:

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 

我寧願不使用像"-Djavax.net.ssl.trustStore" VM參數,因爲我希望能夠控制每個可信證書訪問。

旁註:我看過有人用"mail.imap.socketFactory.class"來設置自己的SocketFactory的實現,自定義TrustManager。 但是當我做我的連接失敗與

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? 

我想這是因爲設置套接字工廠將實際使用SMTP通過SSL的,而不是啓動TLS(它開始作爲一個純文本連接,並切換到TLS版本)。

回答

1

我有這種工作使用com.sun.mail:javax.mail:1.5.5 SMTP連接(未IMAP)和來自(沒有那麼標準)PFX文件加載(根)證書。給Session.getInstance(props)的屬性是建立在以下方式(也看到了API-docs的herehere,我想你可以簡單地用imap取代smtp對於大多數的屬性):

「mail.transport.protocol」 「SMTP」
「mail.smtp.host」, 「主機名」
「mail.smtp.port」, 「25」
「mail.smtp.connecttimeout」, 「5000」 //5秒
「郵件.smtp.timeout 「 」50000「 //50秒
」mail.smtp.ssl.protocols「, 」TLSv1.2工作「
」 mail.sm tp.starttls.required」, 「真」

現在使用com.sun.mail.util.MailSSLSocketFactory(閱讀鏈接中的API-文檔)建立一個SSL套接字工廠:
MailSSLSocketFactory sslSocketFactory = new MailSSLSocketFactory("TLSv1.2");
創建和intialize一個(默認)KeyManagerFactory kmf(例如通過加載密鑰庫)。
創建並初始化(默認)TrustManagerFactory tmf
呼叫sslSocketFactory.setKeyManagers(kmf.getKeyManagers())sslSocketFactory.setTrustManagers(tmf.getTrustManagers())
設置屬性 「mail.smtp.ssl.socketFactory」 到sslSocketFactory實例(使用props.put(k,v) - 方法)。請注意,已創建和配置的套接字工廠實例已設置,而不是某些字符串或類。 Javamail將直接使用set套接字工廠實例。
使用屬性創建會話。

確保您在登錄正確配置並將其設置爲追查com.sun.mail。記錄顯示究竟是什麼「走出過線」,並在我的案例顯示,例如:
DEBUG com.sun.mail.smtp - Found extension "STARTTLS", arg ""
...
TRACE com.sun.mail.smtp.protocol - STARTTLS
TRACE com.sun.mail.smtp.protocol - 220 Ready to start TLS

在一個側面說明:創建默認密鑰庫和trustore可以使用this SslUtils類,方法和loadKeyStore(null)createDefaultTrustStore()(我創建這個工具類前一段時間幫我加載不,所謂完成標準pfx文件)。

+0

除了上述內容,您只需設置['mail.smtp.ssl.trust'](https://javamail.java.net/nonav/docs/api/com/)即可完成更簡單的操作。 sun/mail/smtp/package-summary.html#mail.smtp.ssl.trust)屬性添加到您要信任的主機的名稱。或者,您可以使用[InstallCert](https://java.net/projects/javamail/pages/InstallCert)程序將您的自簽名證書從服務器加載到您的默認信任庫中。 –

+0

我使用的是1.3版本的Java郵件,必須升級才能獲得MailSSLSocketFactory。奇蹟般有效。 – Stroboskop