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

·  阅读 1105

一、问题的发现

问题是前段时间发现和处理,现在再来回顾和总结。那段时间,线上偶尔预警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协议运行机制的概述

image.png

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

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

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

(4)服务端的最后回复

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

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

四、抓包分析

image.png

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

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

五、解决方案

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

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

参考

  1. blog.csdn.net/kevin_mails…
  2. www.ruanyifeng.com/blog/2014/0…
  3. blog.csdn.net/mrpre/categ…
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改