我正在尝试通过 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
...
因此,要么我的推理存在缺陷,一个错误,要么这里还有另一件事我到目前为止还没有考虑过。有任何想法吗?