如何强制JavaMailSenderImpl使用TLS1.2?

Sun*_*nny 6 java email smtp tls1.2

在Tomcat上运行JDK7应用程序,它具有以下env设置:

-Dhttps.protocols=TLSv1.1,TLSv1.2 
Run Code Online (Sandbox Code Playgroud)

上述设置可确保在进行API调用等过程中通过HTTPS连接时不使用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
Run Code Online (Sandbox Code Playgroud)

问题是,当SMTP电子邮件服务器升级到TLS1.2时,它的连接失败.

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

是否存在强制TLS1.2协议的设置或代码更改?

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

-Ddeployment.security.SSLv2Hello=false -Ddeployment.security.SSLv3=false -Ddeployment.security.TLSv1=false
Run Code Online (Sandbox Code Playgroud)

dfr*_*tch 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>
Run Code Online (Sandbox Code Playgroud)

我更新了我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);
Run Code Online (Sandbox Code Playgroud)

我看到Received fatal alert: protocol_version错误已解决。

  • 就我而言,错误是随机的(“..javax.mail.AuthenticationFailedException:421 4.7.66 不支持 TLS 1.0 和 1.1。请升级/更新您的客户端以支持 TLS 1.2。”某些 Microsoft 邮件作为 SMTP 错误返回服务器)并且没有随“1.5.0-b01”一起消失;但升级到最新可用的(`com.sun.mail:javax-mail:1.6.2`)以及会话属性,似乎解决了问题 (3认同)

Sun*_*nny 10

这是下一个看起来的修复:

mail.smtp.starttls.enable = TRUE; mail.smtp.ssl.protocols = TLSv1.2工作;

  • 这些配置值是 JavaMail 道具,对,就像问题中第 2 号代码片段中的其他道具一样。(但它们不是 `-D...` 标志。) (2认同)

小智 6

它在一个相当老的应用程序中对我不起作用,我不明白为什么。经过一番研究,我发现javax.mail应用程序依赖项中的版本是 1.4。您必须至少升级到 1.5。


yan*_*kee 5

Java Mail 最新版本 (1.6.2.) 的更新也修复了该问题。就我而言,我从以下版本升级:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.5.0-b01</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

到:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

这修复了错误

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

我从 Outlook SMTP 服务器获取信息。无需更改属性。