JavaMail SSL,无需认证信任证书

我有一个本地邮件服务器(hMailServer)与SSL(端口465)和一个自签名证书。

域名是“foobar.com”

我已经设置了我的Properties来启用ssl,禁用auth,并信任任何主机

  props.put("mail.smtp.auth", "false"); props.put("mail.smtp.ssl.enable", "true"); props.put("mail.smtp.ssl.trust", "*"); 

如果我通过静态调用将消息发送到Transport.send() ,则会发送电子邮件。

如果我尝试从会话中获取transport实例,那么我得到

 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 

静态调用如何避免SSLHandshakeException?

这是我的测试代码:

 public static void main(String[] args) throws Exception { Properties props = new Properties(); props.put("mail.smtp.host", "127.0.0.1"); props.put("mail.debug", "false"); props.put("mail.smtp.port", "465"); props.put("mail.smtp.timeout", "60000"); props.put("mail.smtp.auth", "false"); props.put("mail.smtp.sendpartial", "true"); props.put("mail.smtp.ssl.enable", "true"); props.put("mail.smtp.ssl.trust", "*"); Session session = Session.getInstance(props); Message message = new MimeMessage(session); message.setFrom(new InternetAddress("mrFoo@foobar.com")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("you@foobar.com")); message.setSubject("Just a Test " + new Date()); message.setText("Hello World"); //Comment and uncomment to test Transport.send(message, message.getAllRecipients()); //Transport t = session.getTransport("smtps"); //t.connect(); //t.sendMessage(message, message.getAllRecipients()); //t.close(); } 

这是一个隐藏在外部的本地系统,所以我不担心中间人攻击生成自己的证书绕过SSL握手……

你要求“smtps”运输。 您设置“smtp”传输的属性。 由于您已将“mail.smtp.ssl.enable”属性设置为“true”,因此您可以只要求“smtp”传输,它将使用SSL。

对此最好的解决方案是使用以下行

  MailSSLSocketFactory socketFactory = new MailSSLSocketFactory(); socketFactory.setTrustAllHosts(true); 

这是使用Spring框架没有身份validation信任证书的JavaMail SSL解决方案,如下所述更改.xml文件。您可以在快照中看到解决方案请参阅此处的图像说明

javax.net.ssl.SSLSocketFactory为true

如果您希望邮件服务器必须在ssl中,请将其更改为false