javax.net.ssl.trustStore上的并发?

时间:2014-08-31 11:58:51

标签: java ssl javamail

我有一个网络应用程序,使用第三方罐子提供银行卡付款。通过SSL进行通信。

我还实现了在使用以下代码进行付款后将发送确认电子邮件(JavaMail)的功能:

// property list
Properties properties = new Properties();

// host
properties.setProperty("mail.smtp.host", smptServer);
// authorization
properties.setProperty("mail.smtp.auth", "true");
// STARTTLS
properties.setProperty("mail.smtp.starttls.enable", "true");
// port
properties.setProperty("mail.smtp.port", "587");
// trust all certificates
properties.setProperty("mail.smtp.ssl.trust", "*");
// debug
properties.setProperty("mail.debug", "true");

问题是:银行软件设置了这样的系统参数:

javax.net.ssl.trustStorePassword
javax.net.ssl.keyStore
javax.net.ssl.keyStoreType
javax.net.ssl.trustStore
javax.net.ssl.keyStorePassword

包含证书的自定义密钥库。

结果我遇到了银行软件工作的情况,但是我无法发送电子邮件或邮件正常工作,但银行软件不是: sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到所请求目标的有效证书路径

简而言之,据我所知,JavaMail必须访问Java cacerts(java / jre / lib / security / cacerts),但银行软件必须使用自定义密钥库...但javax.net.ssl参数只能链接到一个密钥库。 如果我在银行密钥库中导入SMTP服务器证书,则PKIX错误会增加。

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您应该能够将所有证书放在一个信任库中。如果这不起作用,您可能需要安全专家的帮助。有关调试这些问题的提示,请参阅SSLNOTES.txt

作为最后的手段,您可以使用MailSSLSocketFactory设置自己的TrustManager,或将mail..ssl.trust属性设置为您想要信任的服务器。