我最近回答了一个几乎相同的问题question https://stackoverflow.com/questions/68591048/javax-could-not-convert-socket-to-tls/68773865#68773865.
正如您所猜测的,您的问题将与a change https://www.oracle.com/java/technologies/javase/11-0-11-relnotes.html#JDK-8202343在 JDK 中引入,以默认禁用不安全的 TLS 协议版本:
安全库/javax.net.ssl
➜ 禁用 TLS 1.0 和 1.1
TLS 1.0 和 1.1 是 TLS 协议的版本,不再适用
被认为是安全的,并已被更安全和现代的产品所取代
版本(TLS 1.2 和 1.3)。
这些版本现在已默认禁用。如果你遇到
问题,您可以通过删除来重新启用版本,风险自负
“TLSv1”和/或“TLSv1.1”来自jdk.tls.disabledAlgorithms
的安全财产java.security
配置文件。
正如你在错误描述 https://bugs.openjdk.java.net/browse/JDK-8202343,这一更改已向后移植到不同的 JDK 版本,即您正在使用的版本。
为了解决该问题,您可以编辑您的java.security
配置文件并删除TLSv1
and/or TLSv1.1
来自jdk.tls.disabledAlgorithms
安全财产。
此外,您可以在配置属性中显式包含所需的 TLS 协议:
props.put("mail.smtp.ssl.protocols", "TLSv1.2");
老实说,我不明白为什么 Spring Boot 没有应用这个配置,看来你定义它是正确的。您可以在描述时查看库的源代码来检查它邮件属性配置 https://github.com/spring-projects/spring-boot/blob/47516b50c39bd6ea924a1f6720ce6d4a71088651/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailSenderPropertiesConfiguration.java和不同的接受的邮件属性 https://github.com/spring-projects/spring-boot/blob/47516b50c39bd6ea924a1f6720ce6d4a71088651/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mail/MailProperties.java,并且如中所述Spring Boot 文档 https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#application-properties.mail以及。请尝试像这样定义属性:
spring:
mail:
properties:
# other properties you need
"mail.smtp.ssl.protocols": "TLSv1.2"
为了放弃一些可能与 YAML 格式相关的问题,您可以尝试显式设置此属性,仅用于测试,在JavaMaiSenderImpl https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/mail/javamail/JavaMailSenderImpl.html:
public void sendEmail(String to, String subject, String body) {
logger.info("Sending mail to : " + to);
SimpleMailMessage mail = new SimpleMailMessage();
mail.setTo(to);
mail.setSubject(subject);
mail.setText(body);
try {
// Just for validating the solution
JavaMailSenderImpl javaMailSenderImpl = (JavaMailSenderImpl)javaMailSender;
// Please, put a breakpoint here and debug the configured
// properties, it will provide you a valuable information
// about the actual properties that have been applied
javaMailSenderImpl.getJavaMailProperties().put("mail.smtp.ssl.protocols", "TLSv1.2");
javaMailSender.send(mail);
logger.info("Mail sent to " + to);
} catch (Exception e) {
logger.error("Could not send mail to " + to + ". Exception : " + e.getMessage());
}
}