我試圖通過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版本)。
除了上述內容,您只需設置['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)程序將您的自簽名證書從服務器加載到您的默認信任庫中。 –
我使用的是1.3版本的Java郵件,必須升級才能獲得MailSSLSocketFactory。奇蹟般有效。 – Stroboskop