connection reset

问题描述
最近,公司生产环境一个运行了很久的老项目突然发生大量相同报错。简单说就是通过HttpClient调用某第三方服务商的所有接口,一直提示Connection reset。

message:ECEPTION cn.hutool.core.io.IORuntimeException:
SocketException: Connection reset

问题分析:

  1. 验证服务商的网络是否通畅,是否启用了黑名单、白名单之类的限制
    使用命令 telnet ip 端口 测试是否能够连接成功

  2. 验证代码是否有问题
    换用其他能够成功的ip端口号验证

  3. 使用postman调用接口,测试接口是否返回正常

  4. 检查本地服务器上jdk版本,询问服务商jdk版本是否一致
    当jdk不一致的时候,检查https的ssl证书支持的tsl版本是否一致

问题解决:
既不是服务商网络的问题,也不是我们的问题,一下子没有了思路。百度,google一直也查不到原因。
运气好的是,我本地启动项目去调用第三方服务商接口的时候,无意中使用了1.8版本的JDK(这个项目生产的JDK版本是1.7)。然后调用接口成功了。说明这个问题是和JDK版本有关的。
按照这个思路,查找资料。很快,我就怀疑是服务商更新了https的ssl证书,新的证书不支持TLSV1.0。因为JDK1.7默认使用的TLS版本是1.0,所以出现了这个问题。而我本地使用了JDK1.8,所以访问正常。
最后让运维在生产的JVM启动参数加上**-Dhttps.protocols=TLSv1.2**,把默认的TLS版本指定为1.2,成功解决。联系服务商,最后果然是因为他们更新了SSL证书。
总结:
方案1:服务端更改SSL证书,导致不支持TLSV1.0。客户端JDK版本是1.7,默认TLS版本是1.0,所以访问服务端报错Connection reset。要在JVM启动参数增加-Dhttps.protocols=TLSv1.2
方案2:增加Nginx配置,将握手动作交给Nginx来进行
server {
allow 127.0.0.1;
deny all;

    listen      xxxx; //监听端口
	server_name  localhost;
	access_log logs/xxx-access.log log_time;
	error_log logs/xxxx-error.log;
	
	location / {
		proxy_pass xxxxxxxxx; //代理Ip
		proxy_buffers 256 4k;
		proxy_max_temp_file_size 0k;
		proxy_connect_timeout 30;
		proxy_send_timeout 60;
		proxy_read_timeout 120;
		proxy_next_upstream error timeout invalid_header http_502;
	}
	
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

在本地服务器上访问监听的端口即可访问服务商ip信息
Notes:该方法可将https请求转换为http请求

————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

参考链接:https://blog.csdn.net/qq_38404990/article/details/135238433

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值