如何强制JavaMailSenderImpl使用TLS1.2?

24

我有一个在Tomcat上运行的JDK7应用程序,它具有以下环境设置:

-Dhttps.protocols=TLSv1.1,TLSv1.2 

上述设置确保我们在通过HTTPS进行API调用时不使用TLS 1.0。

我们还使用org.springframework.mail.javamail.JavaMailSenderImpl类发送外部SMTP电子邮件,并使用以下属性:

 mail.smtp.auth=false;mail.smtp.socketFactory.port=2525;mail.smtp.socketFactory.fallback=true;mail.smtp.starttls.enable=true

问题在于当升级到TLS1.2时,连接到SMTP电子邮件服务器失败。

javax.net.ssl.SSLHandshakeException: 远程主机在握手期间关闭了连接

是否有设置或代码更改可强制使用TLS1.2协议?

我做了一些搜索,看起来这些环境设置仅适用于小应用程序和Web客户端,而不适用于服务器端应用程序。

-Ddeployment.security.SSLv2Hello=false -Ddeployment.security.SSLv3=false -Ddeployment.security.TLSv1=false
4个回答

54

这是下一个寻找解决方法的人的修复方案:

mail.smtp.starttls.enable=true;
mail.smtp.ssl.protocols=TLSv1.2;

3
这些配置值是JavaMail的属性,对吧?就像问题中代码片段2中的其他属性一样。(但它们不是“-D…”标志。) - KajMagnus

15

在一个比较老的应用程序中,这个方法对我不起作用,我不知道原因。经过一些调查研究,我发现该应用程序依赖的javax.mail版本是1.4。你必须至少升级到1.5版本。


12

在我的情况下,我需要Vojtech Zavrel和Sunny的答案。我正在运行Java 1.8 Spring Boot 1.2.5,并在Big Sur 11.2.3上运行,spring版本为4.2.1.RELEASE。

更新依赖项后,如下所示:

<dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.5.0-b01</version>
</dependency>

我更新了JavaMailSenderImpl与之对应的内容是

Properties prop = new Properties();
prop.setProperty("mail.smtp.auth", "true");
prop.setProperty("mail.smtp.starttls.enable", "true");
prop.setProperty("mail.smtp.ssl.protocols", "TLSv1.2"); // Added this line
prop.setProperty("mail.smtp.ssl.trust", mailUri.getHost());
mailSender.setJavaMailProperties(prop);

我看到了Received fatal alert: protocol_version错误的解决方案。


3
在我的情况下,错误是随机的(某些Microsoft邮件服务器返回SMTP错误:“..javax.mail.AuthenticationFailedException:421 4.7.66不支持TLS 1.0和1.1。请升级/更新您的客户端以支持TLS 1.2。”),并且1.5.0-b01不能解决它;但升级到最新可用版本(com.sun.mail:javax-mail:1.6.2)以及设置会话属性似乎解决了问题。 - Janaka Bandara
我也必须遵循 @JanakaBandara 相同的步骤来解决问题。我正在使用spring boot 2.0.2,必须将其更新为2.0.5。 - kasunb
我还不得不升级我的javax.mail工件 - 但我能够从maven中心看到的最后一个非beta版本1.4升级到1.4.7。这样做再加上设置mail.smtp.ssl.protocols属性对我有用。 - Raj
上述的Java代码运行良好,但请注意还有另一个必需的属性需要提供,否则会出现协议未找到的错误。 prop.setProperty("mail.transport.protocol", "smtp"); - undefined
在我的情况下,我不得不设置prop.setProperty("mail.smtp.ssl.trust", "*"); - undefined

4

最新版本的Java Mail(1.6.2)的更新也修复了这个问题。在我的情况下,我进行了升级:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.5.0-b01</version>
</dependency>

to:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

这个问题已经解决了

javax.mail.AuthenticationFailedException: 421 4.7.66 TLS 1.0和1.1不被支持。请升级/更新您的客户端以支持TLS 1.2

我从Outlook SMTP服务器获取到了这个错误信息,无需更改任何属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接