SSLException: Received fatal alert异常引发的思考

出现问题的背景

我们公司和其他公司有业务往来,我们需要调用他们的Https的接口,前期测试调用他们的接口一切正常,后期对接的过程中,他们升级了JDK版本,然后Java接口崩了,调试发现控制台打印出SSLException: Received fatal alert: 信息,然后开始进入了百度和谷歌之旅。

问题出现转机

茫茫的博客看得一头雾水,尽管做尽尝试,没一篇能解决得了我当前遇到的问题,直到这篇博客出现在眼前https://www.jianshu.com/p/acbfea5ec597,脑袋了多了一份思考,尽管第一次看得时候有点迷茫,多次翻阅突然顿悟其中应该关注的问题点。

产生错误的本质原因

https协议通讯是由tomcat服务器实现的,而tomcat是由java编写的,所以tomcat的运行依赖jdk的环境,其实说白了就是依赖JDK的一些安全机制算法,这就解释了为什么对方升级JDK环境会导致我们java接口的崩溃,尽管我们和对方的JDK都是1.8版本(我们1.8_162,他们1.8_242),但是不同版本的JDK默认的加密策略略有不同,JDK之所以出现这种问题,是因为某些国家法律上限制了某些加密策略。由上所述,这就可能导致了一个问题:我们本地JDK支持的加密策略,对方不支持,导致了tomcat无法建立合法的https连接,所以我们本地看到这个异常SSLException: Received fatal alert。

如何查看Tomcat如何支持支持的加密策略

我所使用的工具是nmap ,具体操作流程可以参考这篇博客,博客里面详细介绍其中的简单的用法https://emacsist.github.io/2017/03/02/https.protocols%E5%9C%A8java%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8/,使用nmap可以探测出他们1.8_242版本的JDK所支持https连接协议和加密算法,细节如图所示,连接协议只支持TLSv1.2,加密策略只支持TLS_ECDHE_RSA。。。一种。
在这里插入图片描述
查看本地JDK支持的https连接协议和加密策略:调用对方接口的时候先调用该接口,System.setProperty(“javax.net.debug”,“all”);
该接口会打印出https网络链接的所有细节,其中比较重要的信息如下图所示:
在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200618183753882.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nL在这里插入图片描述
在这里插入图片描述
从这里可以看到,我们低版本的JDK(1.8_162)默认支持的https连接协议和加密策略,由此可见对方唯一支持的安全策略被我们本地JDK默认的配置给屏蔽了,所以我们本地的接口无法和对方的接口建立正常https连接。

解决方案

方案一:
我们本地JDK开启被禁用的加密算法,JDK如何启用可以参考这篇博客(https://blog.51cto.com/zpf666/2341494?source=dra)。
方案二:
服务器配置,从图下可以看到服务器支持的连接协议有限,像这种情况一定是服务器在tomcat里面单独配置了https连接参数,导致连接握手出现失败。

在这里插入图片描述
服务器配置文件的配置参考下图:
在这里插入图片描述
服务器不配置的话,默认支持所有,参考下图:
在这里插入图片描述

关于https保证安全连接的思考

具体思考参考该博客https://www.cnblogs.com/TIlifeng/p/5488301.html。

猜你喜欢

转载自blog.csdn.net/weixin_39296289/article/details/106838803