我正在尝试使用 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 属性的方法,它只在非安全连接变得安全时使用?