Javamail TLS身份验证

时间:2013-05-30 09:10:53

标签: java email ssl smtp javamail

我正在努力掌握Java Mail API和TLS的基础知识。我有以下情况:

有一台STMP服务器使用TLS& SSL。如果我使用某个客户端登录此服务器,我可以毫无问题地发送经过身份验证和验证的电子邮件。

然后我尝试在不同的计算机上运行Web服务器,该计算机使用前面提到的SMTP服务器发送邮件。我还是想发送TLS& SSL电子邮件,但无论我如何配置启动属性,我都会得到以下众所周知的错误:

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

我发现很多人都有类似的问题,但我的问题是:

考虑到前面描述过的场景,我是否必须向Web服务器(可能在JRE中的某个位置)获取某种证书,或者它应该正常工作,因为邮件服务器已经具有该证书&身份验证机制运行。是不是可以只使用SMTP服务器的证书?无论如何,如果我必须将证书安装到使用STMP服务器的机器上,我该如何获得该证书?

我是JavaMail API的新手,我看过很多关于此的文章,但我找不到答案黑&我的问题是白色的。

2 个答案:

答案 0 :(得分:3)

您的客户端(在您的情况下是在Web服务器上运行的客户端)需要验证邮件服务器的SSL证书。您的java信任库似乎不包含该证书。

因此,您需要将该证书放入JRE的默认信任库(我不建议使用)或为您的应用程序定义不同的信任库(当然需要包含邮件服务器证书)。为此,请设置此VM参数:Djavax.net.ssl.trustStore=<path-to-truststore>

编辑:啊我错过了你问题的某些部分。 要获取邮件服务器的证书,请使用openssl之类的东西。参见例如: https://serverfault.com/questions/139728/how-to-download-ssl-certificate-from-a-website

答案 1 :(得分:2)

答案在JavaMail FAQ

链接网站引用的文字:

  

问:当通过SSL连接到我的邮件服务器时,我得到一个例外,例如“无法找到所请求目标的有效证书路径”。

     

答:您的服务器可能使用的是测试证书或自签名证书,而不是商业证书颁发机构签署的证书。您需要将服务器的证书安装到信任库中。 InstallCert程序将有所帮助。

     

或者,您可以将“mail.protocol.ssl.trust”属性设置为邮件服务器的主机名。有关详细信息,请参阅协议提供程序包的javadoc。

     

此问题的其他常见原因是:

     
      
  • 有一个防火墙或反病毒程序拦截您的请求。
  •   
  • 您的JDK安装有问题,导致它无法找到受信任的证书颁发机构的证书。
  •   
  • 您正在应用程序服务器中运行,该服务器已覆盖JDK的可信证书颁发机构列表。
  •