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

时间:2010-12-03 12:28:44

标签: java port javamail ssl truststore

我正在尝试使用TLS在端口25(无SSL)上使用JavaMail发送邮件,但是使用我自己的信任库(因为原始cacerts信任库不包含所需的证书,我不想修改默认信任库Java)。 我有能够使用系统信任库使用TLS发送邮件的代码,通过设置

mail.smtp.starttls.enable=true

属性,也是,设置

System.setProperty("javax.net.ssl.trustStore", ...) 
当连接安全起作用时,

指向正确的信任库。由于它是普通端口25,我不需要设置任何 socketFactory 属性(和实现)。我可以使用系统信任库在端口25上使用TLS发送邮件。

然而..切换系统属性能够设置正确的信任存储是有点傻,特别是在服务器上,当我不知道其他代码想要发送邮件,可能需要使用系统属性作为好吧,总的来说:我正在寻找另一种解决方案既不修改系统信任库( cacerts 文件,制作它的副本并修改副本就好了!)也不是当前需要的系统属性设置它。

我已经尝试过了:

  • 设置我自己的SSL socketFactory 并使用我自己的密钥管理器加载另一个信任库。当没有需要发送端口25但是我已经可以在端口465上启动安全连接时,这将非常完美。但是..我不能这样做,这样做最终会出现套接字异常,因为我我试图安全地连接到不受保护的邮件服务器。

  • 尝试设置我自己的 socketFactory ,但使用普通套接字进行实际通信。这基本上与完全不使用我自己的socketFactory相同,最后使用系统cacerts trustStore文件使用Java。

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

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

所以..简而言之:有没有人知道如何在端口25上使用与邮件服务器的非安全连接,打开TLS(通过设置邮件属性)的解决方案,这在内部保护连接并使用我的自己的信任库文件没有修改cacerts或系统属性?也许有一种类似于socketFactory属性的方法,只有当非安全连接安全时才会使用它?

2 个答案:

答案 0 :(得分:0)

使用-Djavax.net.ssl.trustStore = ...

启动您的应用程序

然后它只与您的Java应用程序相关,而没有其他系统属性。

答案 1 :(得分:0)

哎呀..发现它..有两个socketFactory属性可以传递..一个用于SSL,另一个用于非ssl工厂..