我正在尝试通过TLS-SMTP从我的应用程序发送电子邮件。 这在本地运行(Tomcat7,Java7,Windows)但在生产中不起作用(Tomcat7,Java6,Linux)。 包含SMTP服务器公共证书的信任库随应用程序一起提供,通过
手动设置System.setProperty("javax.net.ssl.trustStore", "pathToJssecacerts")
并且两种情况都相同。 我使用
验证了这一点System.getProperty("javax.net.ssl.trustStore")
在邮件发送之前,它返回指向相应环境中商店的绝对路径。
因此,据我所知,两个应用程序环境都使用完全相同的信任库。 (有没有办法绝对肯定?)
我正在使用
System.setProperty("javax.net.debug", "ssl:handshake:trustmanager");
获得更多洞察力,但两种环境之间的输出差别很大,可能是由于Java6和Java7之间存在差异。 生产中的错误(Java6)读取:
...
SEND TLSv1 ALERT: fatal, description = certificate_unknown
WRITE: TLSv1 Alert, length = 2
called closeSocket()
handling exception: 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
...
所以要么我的推理存在缺陷,要么是错误,或者到目前为止我还没有考虑过另一件事。有什么想法吗?
答案 0 :(得分:0)
此消息表示Java无法使用您的证书构建信任链。
作为测试,您可以尝试设置属性
System.setProperty("mail.smtp.ssl.trust", "*");
此属性将覆盖默认行为并信任所有证书。
注意:不建议在制作中使用。