JavaMail:25端口上的TLS是否可以使用单独的信任存储?

JavaMail:25端口上的TLS是否可以使用单独的信任存储?,java,port,jakarta-mail,ssl,truststore,Java,Port,Jakarta Mail,Ssl,Truststore,我尝试在端口25上使用JavaMail发送邮件,没有使用TLS的SSL,但是使用我自己的信任库,因为原始的cacerts信任库不包含所需的证书,并且我不想修改Java的默认信任库。 通过设置 mail.smtp.starttls.enable=true 财产,还有,设置 System.setProperty("javax.net.ssl.trustStore", ...) 在连接安全时指向正确的信任库。因为它是普通的端口25,所以我也不需要设置任何socketFactory属性和实现。我可

我尝试在端口25上使用JavaMail发送邮件,没有使用TLS的SSL,但是使用我自己的信任库,因为原始的cacerts信任库不包含所需的证书,并且我不想修改Java的默认信任库。 通过设置

mail.smtp.starttls.enable=true
财产,还有,设置

System.setProperty("javax.net.ssl.trustStore", ...) 
在连接安全时指向正确的信任库。因为它是普通的端口25,所以我也不需要设置任何socketFactory属性和实现。我可以使用system truststore在端口25上使用TLS发送邮件

然而。。切换系统属性以设置正确的信任存储有点愚蠢,尤其是在服务器上,当我不知道其他代码想要发送邮件,并且可能还需要使用系统属性时,一般来说:我正在寻找另一种解决方案,既不修改系统信任存储,也不修改cacerts文件,制作副本并修改副本是可以的!也不是当前设置它所需的系统属性

我已经试过了:

设置我自己的SSL socketFactory并使用我自己的密钥管理器加载另一个truststore。当不需要在端口25上发送时,这将非常完美,但我已经可以在端口465上启动安全连接。然而我不能这样做,这样做会导致套接字异常,因为我正在尝试安全地连接到邮件服务器,但它没有受到保护

试图建立我自己的socketFactory,但使用普通的套接字进行实际通信。这与根本不使用自己的socketFactory是一样的,最终Java使用system cacerts trustStore文件

修改cacerts系统信任库文件。这是可行的,但我不想修改系统的信任存储,我可能没有写权限,或者密钥库密码可能会被修改,等等

修改javax.net.ssl.trustStore系统属性以指向我自己的信任库文件。工作得很好,但我也不想修改系统属性,因为我的代码在服务器上运行,我不知道还有哪些代码在那里运行,需要完整的属性。即使保存前一个状态并进行恢复,也不能真正防止其他线程在修改该属性时使用该属性,因此我不太喜欢这个解决方案


所以。。简言之:有人知道一个解决方案吗?我如何使用到端口25上邮件服务器的非安全连接,通过设置mail属性打开TLS,这在内部保护连接并使用我自己的truststore文件,而无需修改cacerts或系统属性?可能有一种类似于socketFactory属性的方法,它仅在非安全连接变得安全时使用?

使用-Djavax.net.ssl.trustStore=


然后它将只与java应用程序相关,而不与其他系统属性相关。

使用-Djavax.net.ssl.trustStore=


然后,它将只与java应用程序相关,而与其他系统属性无关。

哎呀。。找到了。。可以传递两个socketFactory属性。。一个用于SSL,另一个用于非SSL工厂。。找到了。。可以传递两个socketFactory属性。。一个用于SSL,另一个用于非SSL工厂..

实际上,情况正好相反:一旦启动应用程序,并使用-D将系统属性传递给命令行。。。您正在定义一个系统属性,因此它的名称与整个进程相关。问题是,我们的进程承载大量线程,所以基本上,我需要的是一种通过线程或更好的连接来控制它的方法。我后来才发现,对我来说,答案是肯定的,但谢谢:-事实上,情况正好相反:一旦启动应用程序,并使用-D将系统属性传递给命令行。。。您正在定义一个系统属性,因此它的名称与整个进程相关。问题是,我们的进程承载大量线程,所以基本上,我需要的是一种通过线程或更好的连接来控制它的方法。我发现,就在不久之后,所以对我来说,这是回答无论如何,但谢谢:-我有同样的问题,你为你的问题找到的答案,我很感兴趣。你能分享一下吗?谢谢,Valentin请查看com.sun.mail的软件包摘要以查看所有属性。基本上,您可以将mail.smtp.socketFactory.class和mail.smtp.ssl.socketFactory.class设置为具有用于ssl和非ssl通信的工厂。TLS可以从一开始就是SSL,在我的例子中,开始是非SSL的,但一旦建立了通信,就切换到SSL。为了能够在每个线程(而不仅仅是系统范围内)执行此操作,您只需要将自己的属性实例传递给Session.getInstanceProperties即可
我和你有同样的问题,我对你的问题的答案很感兴趣。你能分享一下吗?谢谢,Valentin请查看com.sun.mail的软件包摘要以查看所有属性。基本上,您可以将mail.smtp.socketFactory.class和mail.smtp.ssl.socketFactory.class设置为具有用于ssl和非ssl通信的工厂。TLS可以从一开始就是SSL,在我的例子中,开始是非SSL的,但一旦建立了通信,就切换到SSL。为了能够在每个线程(而不仅仅是系统范围内)执行此操作,您只需要使用相应的属性集将自己的属性实例传递给Session.getInstanceProperties。