javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake 心路历程

这是一篇小白文 0.0 嘻嘻

开发时,需要调用到第三方的web服务接口,出现了这个问题,初次见面,对这个问题有点陌生,因为之前也没有去了解过这一块(毕竟刚出来工作哈)

1、一开始通过搜索大致了解到这个东西大致可能和ssl协议的选择有关,于是去了解用户环境中使用的jdk版本以及第三方服务器的jdk版本。同时,在网络中找到一张图片(侵权私删哈),观察了各版本jdk对应使用的协议
jdk对应协议图

通过上图,可以看到一些默认使用情况,以及可以搜索一下,网上有挺多改默认的方法。

然而询问后发现,第三方服务用的jdk版本是1.6的,然而我们的是1.7的,按照图片上来看,默认的协议都是一样的,同时双方都没有修改过这一类型的操作

于是继续的去寻找答案,花了一点时间后发现,可能是web服务端配置的是SSL双向认证,而我们只是按照单向认证时发送的,这样就导致服务端验证客户端证书时,发现客户端没有证书,然后就断开了握手连接。

最后与服务端那边沟通,获取了中间证书文件,使用java的keytool将证书导入后解决了问题。

感谢阅读,欢迎大家指点与批评

javax.net.ssl.SSLHandshakeException: Connection closed by peer通常是由于SSL握手失败引起的。这可能是由于以下原因之一导致的: 1. 服务器不支持SSL协议版本或加密套件。 2. 客户端和服务器之间存在代理,代理可能会干扰SSL握手。 3. 证书问题,例如证书过期或不受信任。 解决此问题的方法包括: 1. 确保服务器支持客户端使用的SSL协议版本和加密套件。 2. 检查代理设置并尝试直接连接服务器。 3. 检查证书是否过期或不受信任,并确保证书链完整。 以下是一些可能有用的代码片段: ```java // 禁用SSL验证 TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkClientTrusted(X509Certificate[] certs, String authType) { } public void checkServerTrusted(X509Certificate[] certs, String authType) { } }}; SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, trustAllCerts, new java.security.SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); // 设置代理 System.setProperty("https.proxyHost", "yourProxyServerHostname"); System.setProperty("https.proxyPort", "yourProxyServerPort"); // 打印证书信息 HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); conn.connect(); Certificate[] certs = conn.getServerCertificates(); for (Certificate cert : certs) { System.out.println(cert); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值