admin管理员组

文章数量:1567915

功能场景

邮件发送

问题描述

  • 项目需要从单体变成集群部署,且为了应对高并发,采用两台服务器分散压力,一台为旧的,一台为新的。
  • 两台服务器,jdk版本一致,均为openjdk-1.8.0.312.b07,但是一台服务器能发送邮件,另一台却失败。
  • 在服务器上安装sendmail等工具,能直接发邮件。
  • 阿里云上的安全组对465端口开放,使用465端口发送邮件。
  • 新服务器上使用代码发送邮件报错:
    • Could not connect to SMTP host: smtp.163, port: 465, response: -1
    • javax.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, port: 465。就以为是阿里云的465端口权限没有开好导致的,但是试了直接在服务器上用sendmail发送邮件,可以成功,那么排除是服务器的问题。
  • 两台服务器,一台成功,一台失败,一样的代码产生了不同的结果,排除是代码的问题。
  • 既不是服务器也不是代码的问题,那么还能想到是哪里的问题呢?
  • 通过No appropriate protocol 这个报错,最终发现了问题所在:jdk拦截了SSLv3请求

问题解决

  1. 找到jdk安装路径

echo $JAVA_HOME

  1. 找到配置文件

/jre/lib/security/java.security

  1. 定位到指定行

/SSLv3

  1. 修改配置文件

删除SSLv3、TLSv1、TLSv1.1

  1. 执行修改命令

update-crypto-policies --set LEGACY

  1. 重启项目

本文标签: Bugprotocol