1

我正在尝试通过 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
...

因此,要么我的推理存在缺陷,一个错误,要么这里还有另一件事我到目前为止还没有考虑过。有任何想法吗?

4

1 回答 1

0

此消息意味着 Java 无法使用您的证书构建信任链。

作为测试,您可以尝试设置属性

System.setProperty("mail.smtp.ssl.trust", "*");

此属性将覆盖默认行为并信任所有证书。

注意:不建议在生产中这样做。

于 2013-12-17T23:04:15.773 回答