2016-01-13 105 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