邮件发送报No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

现象

邮件发送开启ssl加密后,对于普通的springboot服务,可以正常发送,但是在flink里面写的业务逻辑报No appropriate protocol (protocol is disabled or cipher suites are inappropriate),很是奇怪。

原因

是由于jdk的版本不一致导致的。

解决

1、更换合适的jdk版本(不建议)。
2、其实产生这个原因是在jdk的java.security文件中配置项配置了 SSLv3、TLSv1、TLSv1.1 ,把这几个删了即可。直接搜索find / -name 'java.security',vim 这个文件进行删除并重启Java程序即可。在这里插入图片描述
3、springboot配置文件直接配置ssl参数即可(最简单的方式)。

 mail.smtp.starttls.enable:true
 mail.smtp.auth:true
 mail.smtp.socketFactory.class:javax.net.ssl.SSLSocketFactory
 mail.smtp.socketFactory.port:465
 mail.smtp.port:465
 mail.smtp.ssl.protocols:TLSv1.2
### Java 发送邮件时出现 `No appropriate protocol` 错误的解决方案 在处理 `javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)` 的问题时,通常是因为客户端和服务器之间的 SSL/TLS 握手失败。这可能是由于以下几个原因引起的: #### 原因分析 1. **协议版本不匹配** 客户端支持的 TLS/SSL 版本可能与服务器支持的版本不同。例如,在 JDK 8 中,默认情况下仅启用部分协议(如 TLSv1 和 TLSv1.2),而不支持更高版本的协议(如 TLSv1.3)。如果服务器要求更高的协议版本,则会引发此错误[^3]。 2. **加密套件不兼容** 加密套件是指用于安全通信的一组算法组合。如果客户端和服务器之间无法协商一致的加密套件,则也会导致握手失败[^2]。 3. **配置问题** 配置文件中的参数设置可能导致强制使用某些已过期或不受信任的协议。例如,`useSSL=true` 可能会导致连接尝试使用不再受支持的安全协议[^4]。 --- #### 解决方案 以下是几种常见的解决方法: ##### 方法一:显式指定支持的协议版本 可以通过 JVM 参数来控制使用的协议版本。例如,确保只允许使用较新的协议版本(如 TLSv1.2 或以上): ```bash -Dhttps.protocols=TLSv1.2,TLSv1.3 ``` 或者通过代码动态设置支持的协议版本: ```java import javax.net.ssl.HttpsURLConnection; import java.util.Arrays; public class ProtocolConfig { public static void main(String[] args) throws Exception { HttpsURLConnection.setDefaultSSLSocketFactory(createCustomSocketFactory()); } private static SSLSocketFactory createCustomSocketFactory() { try { SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(null, null, new java.security.SecureRandom()); SSLSocketFactory socketFactory = sslContext.getSocketFactory(); ((SSLSocket) socketFactory.createSocket()).setEnabledProtocols(new String[]{"TLSv1.2"}); return socketFactory; } catch (Exception e) { throw new RuntimeException(e); } } } ``` 这样可以确保应用程序不会尝试使用已被禁用的老化协议。 ##### 方法二:关闭 SSL 验证 对于开发环境或测试场景,可以选择完全禁用 SSL 验证。注意这种方法不适合生产环境,因为它降低了安全性。 修改数据库 URL 并添加 `&useSSL=false` 参数即可实现这一点: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC ``` 类似的策略也可以应用于邮件服务提供商的 URL 设置中。 ##### 方法三:升级 JDK 版本 考虑到旧版 JDK 对现代安全标准的支持有限,建议尽可能迁移到更新版本的 JDK(如 JDK 11 或更高版本)。这些新版本默认启用了更先进的加密技术和协议,并修复了许多潜在漏洞。 ##### 方法四:调整邮件服务器配置 如果是发送电子邮件过程中遇到了该问题,还可以考虑联系邮件服务商请求他们开放更多兼容选项;或者更改自己的程序以适应对方的要求——比如切换到 STARTTLS 而非纯 SSL 方式来进行数据传输。 --- ### 总结 针对 `No appropriate protocol` 错误,推荐优先采用方式一是因为其兼顾了灵活性与安全性;而当确实存在特殊需求时再酌情选用其他手段作为补充措施。务必记得验证最终改动后的效果并记录下所做的一切变更以便后续排查可能出现的新状况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值