我正在尝试使用TLS但使用我自己的信任库在端口25(无SSL)上使用JavaMail发送邮件(因为原始的cacerts信任库不包含所需的证书,并且我不想修改Java的默认信任库) 。
我的代码可以通过设置系统信任库使用TLS使用TLS发送邮件
mail.smtp.starttls.enable=true
财产,也建立
System.setProperty("javax.net.ssl.trustStore", ...)
在安全连接时指向正确的信任库的方法是可行的。由于它是正常的端口25,因此我也不需要设置任何socketFactory属性(和实现)。我可以使用系统信任库在端口25上使用TLS发送邮件。
但是,在我不知道还有什么其他代码想要发送邮件并且可能还需要使用系统属性的情况下,切换系统属性以能够设置正确的信任库有点愚蠢,尤其是在服务器上。 general:我正在寻找另一种解决方案,既不能修改系统信任库(cacerts文件,制作它的副本并修改副本也可以!),也不是当前需要设置它的系统属性。
我已经尝试过的
设置我自己的SSL socketFactory并使用自己的密钥管理器加载另一个信任库。当不需要在端口25上发送时,这将绝对完美,但是我可以在端口465上启动安全连接。但是,..我无法做到这一点,最终导致套接字异常,因为我正在尝试安全地连接到不受保护的邮件服务器。
尝试设置我自己的socketFactory,但使用普通套接字进行实际通信。这基本上与完全不使用我自己的socketFactory相同,并且最终使用系统cacerts trustStore文件以Java结尾。
修改cacerts系统信任库文件。这可行,但是我不想修改系统的信任库,我可能没有写权限,或者可以修改密钥库密码,等等。
修改
"javax.net.ssl.trustStore"
系统属性以指向我自己的信任库文件。效果很好,但是我也不想修改系统属性,因为我的代码在服务器上运行,并且我不知道还有什么其他代码在服务器上运行并且需要完整的属性。即使保存以前的状态并进行还原,也并不能真正防止其他线程在修改该属性时使用此属性,因此我并不喜欢这种解决方案。简而言之:有谁知道一种解决方案,该如何使用非安全连接到端口25上的邮件服务器,打开TLS(通过设置mail属性),从而在内部保护连接并使用我自己的信任库文件没有修改证书或系统属性?也许有一种与socketFactory属性类似的方法,仅在非安全连接变得安全时才使用?
最佳答案
使用-Djavax.net.ssl.trustStore = ...启动您的应用程序
那么它将仅与您的Java应用程序相关,而与其他系统属性无关。