我有一个网络应用程序,使用第三方罐子提供银行卡付款。通过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错误会增加。
如何解决这个问题?
答案 0 :(得分:1)
您应该能够将所有证书放在一个信任库中。如果这不起作用,您可能需要安全专家的帮助。有关调试这些问题的提示,请参阅SSLNOTES.txt。
作为最后的手段,您可以使用MailSSLSocketFactory设置自己的TrustManager,或将mail..ssl.trust属性设置为您想要信任的服务器。