本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
功能场景
邮件发送
问题描述
- 项目需要从单体变成集群部署,且为了应对高并发,采用两台服务器分散压力,一台为旧的,一台为新的。
- 两台服务器,jdk版本一致,均为openjdk-1.8.0.312.b07,但是一台服务器能发送邮件,另一台却失败。
- 在服务器上安装sendmail等工具,能直接发邮件。
- 阿里云上的安全组对465端口开放,使用465端口发送邮件。
- 新服务器上使用代码发送邮件报错:
- Could not connect to SMTP host: smtp.163.com, port: 465, response: -1
- javax.net.ssl.SSLHandshakeException: No appropriate protocol。
javax.mail.MessagingException: Could not connect to SMTP host: smtp.163.com, port: 465, response: -1
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1960)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:642)
at javax.mail.Service.connect(Service.java:295)
......
javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1972)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:642)
at javax.mail.Service.connect(Service.java:317)
at javax.mail.Service.connect(Service.java:176)
at javax.mail.Service.connect(Service.java:125)
at javax.mail.Transport.send0(Transport.java:194)
at javax.mail.Transport.send(Transport.java:124)
问题定位
- 报错中有这么一段:Could not connect to SMTP host: smtp.163.com, port: 465。就以为是阿里云的465端口权限没有开好导致的,但是试了直接在服务器上用sendmail发送邮件,可以成功,那么排除是服务器的问题。
- 两台服务器,一台成功,一台失败,一样的代码产生了不同的结果,排除是代码的问题。
- 既不是服务器也不是代码的问题,那么还能想到是哪里的问题呢?
- 通过No appropriate protocol 这个报错,最终发现了问题所在:jdk拦截了SSLv3请求
问题解决
- 找到jdk安装路径
echo $JAVA_HOME
- 找到配置文件
/jre/lib/security/java.security
- 定位到指定行
/SSLv3
- 修改配置文件
删除SSLv3、TLSv1、TLSv1.1
- 执行修改命令
update-crypto-policies --set LEGACY
- 重启项目