Spring Boot使用JavaMailSender发邮件报SSLHandshakeException,如何强制用TLSv1.2?
配置未生效原因
你在application.yml中配置ssl.protocols的语法本身没有错误,失效通常是两个原因:
- 扁平化key的写法容易因为缩进问题,导致配置没有正确映射到JavaMail的属性规则
- 你使用的Java 8 292版本默认禁用了旧版TLS对应的加密套件,仅指定TLS版本不足以完成握手,需要额外指定兼容的加密套件
解决方案
方案1:修正application.yml配置
推荐将邮件配置按层级展开,避免缩进错误,额外补充加密套件配置:
spring: mail: host: smtp.gmail.com port: 587 username: ******@gmail.com password: ******* protocol: smtp properties: mail: smtp: auth: true starttls: required: true enabled: true ssl: trust: smtp.gmail.com protocols: TLSv1.2 # 补充兼容TLS1.2的加密套件 ciphersuites: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
如果需要排查问题,可以添加mail.debug: true配置到properties.mail.smtp下,开启后会在控制台打印完整的TLS握手日志,确认TLS版本是否正确加载。
方案2:手动配置JavaMailSender
如果配置文件仍然不生效,可以通过自定义配置类强制覆盖JavaMail属性:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.JavaMailSenderImpl; import java.util.Properties; @Configuration public class MailConfig { @Bean public JavaMailSender customJavaMailSender() { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost("smtp.gmail.com"); mailSender.setPort(587); mailSender.setUsername("******@gmail.com"); // Gmail需先开启两步验证,再生成应用专用密码填入此处 mailSender.setPassword("*******"); Properties props = mailSender.getJavaMailProperties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.starttls.required", "true"); props.put("mail.smtp.ssl.trust", "smtp.gmail.com"); // 强制指定TLS版本 props.put("mail.smtp.ssl.protocols", "TLSv1.2"); // 指定兼容的加密套件 props.put("mail.smtp.ssl.ciphersuites", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"); // 调试时开启即可 // props.put("mail.debug", "true"); return mailSender; } }
使用时直接注入customJavaMailSender替代原有自动注入的JavaMailSender即可。
注意事项
- 不要修改JDK的
jdk.tls.disabledAlgorithms配置,该配置是JDK的安全特性,移除TLSv1、TLSv1.1会降低服务整体安全等级 - 如果你使用Gmail发信,当前Gmail已经不再支持低安全等级的账号密码登录,需要先开启谷歌账号的两步验证,生成应用专用密码后填入配置,否则会出现鉴权失败的问题
内容的提问来源于stack exchange,提问作者VishnuVS
相关产品推荐
相关产品推荐

