SSL/TLS握手时报Remote host closed connection during handshake

一、问题的发现

问题是前段时间发现和处理,现在再来回顾和总结。那段时间,线上偶尔预警Remote host closed connection during handshake这个报错,次数大概是一天3-10次左右,频率不高。一开始没有多少关注,但心想既然出现了,总要查个究竟。

这个功能请求了一个第三方接口,使用https协议。

二、尝试处理

自己对https协议理解不深,出现这个问题,先是百度,后是谷歌,反正查的都查了。网上分析的原因无非是两种:

①、ssl版本问题

②、ssl证书验证问题

③、jdk1.8加密套件问题,相关配置是crypto.policy

其中,说ssl版本问题的说法最多,这三种问题的处理方法对应的是,升级ssl版本,生产代码默认使用的是tls 1.0,所以能升级看看;另一种是去掉ssl证书验证,就是对所有证书全部信任。相关代码如下:

X509TrustManager xtm = new X509TrustManager() {
	@Override
	public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}

	@Override
	public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}

	@Override
	public X509Certificate[] getAcceptedIssuers() {
		return null;
	}
};

SSLContext ctx = SSLContext.getInstance("TLSv1.0");
ctx.init(null, new TrustManager[]{xtm}, null);
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE);

很明显,当信心满满的上线后,发现,问题依然存在。对前两种没有起效,只能看看修改Java\jre\lib\security\java.security文件的

crypto.policy=unlimited

具体的分析和原理,请看参考资料1.这里不做多分析

很明显,第三种尝试,也不能解决问题。没办法了,只能抓包了。为什么最后是抓包,就像那句“源码面前,了无秘密”,所有数据交互,都可以通过抓包看到。

三、预备知识

抓包分析之前,我们必须对ssl有所了解,虽然不用很深入,但是基本原理是要了解的,所以就是问题驱动学习,让我学习了一下ssl。ssl和tls的区别:tls是在ssl的基础上发展的,两者会有些区别,其中最重要的是tls在安全性和内容上做了增强和改进。而https协议,是在tcp和http协议间,嵌入了tls协议,做加密内容。

SSL/TLS协议运行机制的概述

在这里插入图片描述

(1)客户端先发起clienthello,同时还会发送随机数

(2)服务端回复serverhello,同时还会发送证书和随机数

(3)客户端还会发送一个随机数,如果客户端要求验证证书的可靠性,还会发送CertificateVerify等

(4)服务端的最后回复

这里证书包含了公钥,公钥用来加密随机数,而不是加密交互的内容,真正用来加密内容的是三个随机数组合而成的密码,双方使用这个密码加密解密

了解这个握手流程,是为了看懂抓捕的报文,还想深入了解tls的,可以参考资料3

四、抓包分析

在这里插入图片描述

抓包分析的结果是,客户端收到服务器发送的证书后,回复ACK,此时服务器却结束了连接,发送FIN给客户端。由此可见,问题是出在服务端,也就是第三方,而不是自己这边。

另外,我还把这个异常的报文和正常的报文做了比较,发现两者的协议版本、证书、加密套件等都是一样,也就更加确定和排除了上面分析的原因

五、解决方案

很明显,只能让接口提供方排查,最后发现是对方服务器故障(具体原因不得而知),后面移除了有问题的服务器,问题就解决了。

所以,出现这种问题,除了可能是上面讲的原因外,还有可能是对方服务器的问题。

参考

  1. https://blog.csdn.net/kevin_mails/article/details/82143490
  2. http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
  3. https://blog.csdn.net/mrpre/category_9270159.html
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值