我试图通过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