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

标签 java ssl jakarta-mail

我有一个 Web 应用程序,它使用 3rd 方 jar 提供银行卡支付。通过 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

包含证书的自定义 keystore 。

结果我遇到了这样一种情况,银行软件可以运行,但我无法发送电子邮件,或者邮件可以运行,但银行软件不能: sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径

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

如何解决?

最佳答案

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

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

关于java - javax.net.ssl.trustStore 上的并发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25591754/

相关文章:

java - 具有多个条件的 QueryDSL 谓词 SetPath.any

security - 如何在 Apache ActiveMQ 中禁用 SSLv3 协议(protocol)?

JavaMail 和 Java 1.4 - 未找到记录器

java - 在 JavaMail 中使用 message.getFrom() 时仅获取要显示的电子邮件地址

java - Eclipse、Javamail、Tomcat 和套接字无法访问/网络无法访问?

java - 从 Java 连接 PHP 时出现 IllegalStateException

java - 基本的 Java 算法给我一个 nullpointerexception 错误?

java - setComponentOrientation 对表单设计器没有影响

apache - 是否可以在不支付任何费用的情况下使用 https(自己的服务器)?

java - SoftLayer SSL VPN 门户 java.lang.NullPointerException @macOS Sierra