【发布时间】:2010-12-03 12:28:43
【问题描述】:
我正在尝试使用 TLS 在端口 25(无 SSL)上使用 JavaMail 发送邮件,但使用我自己的信任库(因为原始 cacerts 信任库不包含所需的证书,我不想修改默认信任库爪哇)。 我的代码能够使用系统信任库使用 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 属性的方法,它只在非安全连接变得安全时使用?
【问题讨论】:
-
我和你有同样的问题,我对你为你的问题找到的答案很感兴趣。你能分享一下吗?谢谢,瓦伦丁
-
查看 com.sun.mail 的包摘要以查看所有属性。基本上你可以设置“mail.smtp.socketFactory.class”和“mail.smtp.ssl.socketFactory.class”来拥有一个用于SSL和非SSL通信的工厂。 TLS 从一开始就可以是 SSL,在我的情况下,一开始是非 SSL,但是一旦建立通信就切换到 SSL。为了能够在每个线程而不是在系统范围内执行此操作,您只需要您自己的 Properties 实例,并将其传递给 Session.getInstance(Properties) 并设置相应的属性。
标签: java port jakarta-mail ssl truststore