Jenkins测试邮件通知抛出java.io.EOFException: SSL peer shut down incorrectly错误
你之前通过脚本控制台执行的System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2")属于临时运行时配置,仅在本次Jenkins进程运行期间生效,服务重启或者进程重载后配置就会丢失,这是你执行后一段时间错误复现的核心原因。另外微软Office 365的SMTP服务已经停止支持TLS 1.0、TLS 1.1协议,仅允许TLS 1.2及以上版本建立连接,你配置的协议列表包含已弃用的低版本协议也可能触发服务端主动断开连接。
可行解决方案
- 永久配置JVM TLS协议参数
找到Jenkins对应的Java启动参数配置文件:- Linux系统通常存放在
/etc/sysconfig/jenkins或/etc/default/jenkins中 - Windows服务部署的可以在服务管理器的Jenkins属性页「路径到可执行文件」中修改启动参数
找到JENKINS_JAVA_OPTIONS配置项,在值的末尾追加如下参数:
修改完成后重启Jenkins服务,配置就会永久生效。-Dmail.smtp.ssl.protocols=TLSv1.2 -Dhttps.protocols=TLSv1.2 - Linux系统通常存放在
- 调整邮件发送配置匹配Office 365要求
进入Jenkins「系统管理」-「系统配置」-「邮件通知」板块,确认以下配置正确:- SMTP服务器地址为
smtp.office365.com,端口为587 - 勾选使用SMTP认证,填写正确的Office 365邮箱账号和授权码
- 勾选使用STARTTLS选项,不要勾选使用SSL协议选项
- 发件人邮箱地址必须和认证使用的Office 365邮箱完全一致
- SMTP服务器地址为
- 导入Office 365根证书到JDK信任库
如果你使用的JDK版本较旧,默认信任库未收录Office 365的根证书,也会导致SSL握手失败,可执行以下操作导入证书:- 导出Office 365 SMTP服务的证书:
openssl s_client -connect smtp.office365.com:587 -starttls smtp < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > office365.crt- 将证书导入到Jenkins使用的JDK信任库中:
导入完成后重启Jenkins服务即可。# 请将命令中的JDK路径替换为你实际使用的JDK安装路径 keytool -import -alias office365-smtp -file office365.crt -keystore /your/jdk/path/jre/lib/security/cacerts -storepass changeit
内容的提问来源于stack exchange,提问作者LesterTriple7
相关产品推荐
相关产品推荐

