相关文章推荐
自信的小狗  ·  RStudio 改名 ...·  1 年前    · 
安静的海龟  ·  HttpCookies.Append ...·  1 年前    · 

遇到一个问题很棘手两天了还没解决掉,报错如下:

javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:980) ~[na:1.8.0_45]
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363) ~[na:1.8.0_45]
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391) ~[na:1.8.0_45]
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1375) ~[na:1.8.0_45]
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563) ~[na:1.8.0_45]
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) ~[na:1.8.0_45]
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153) ~[na:1.8.0_45]
        at com.dangdang.ddframe.job.executor.type.SimpleJobExecutor.process(SimpleJobExecutor.java:41) [elastic-job-common-core-2.1.5.jar:na]
        at com.dangdang.ddframe.job.executor.AbstractElasticJobExecutor.process(AbstractElasticJobExecutor.java:206) [elastic-job-common-core-2.1.5.jar:na]
        at com.dangdang.ddframe.job.executor.AbstractElasticJobExecutor.process(AbstractElasticJobExecutor.java:171) [elastic-job-common-core-2.1.5.jar:na]
        at com.dangdang.ddframe.job.executor.AbstractElasticJobExecutor.execute(AbstractElasticJobExecutor.java:150) [elastic-job-common-core-2.1.5.jar:na]
        at com.dangdang.ddframe.job.executor.AbstractElasticJobExecutor.execute(AbstractElasticJobExecutor.java:122) [elastic-job-common-core-2.1.5.jar:na]
        at com.dangdang.ddframe.job.lite.internal.schedule.LiteJob.execute(LiteJob.java:26) [elastic-job-lite-core-2.1.5.jar:na]
        at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [quartz-2.2.1.jar:na]
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [quartz-2.2.1.jar:na]
Caused by: java.io.EOFException: SSL peer shut down incorrectly
        at sun.security.ssl.InputRecord.read(InputRecord.java:505) ~[na:1.8.0_45]
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:961) ~[na:1.8.0_45]
        ... 21 common frames omitted

这个是他们用httpclient 调用三方的一个https的接口,在本地单元测试没问题,用浏览打开也没问题。

因为之前遇到类似问题,就很自信的在网络上找相关的解决方案,找了好多方案,例如:System.setProperty(“https.protocols”, “TLSv1,TLSv1.1,TLSv1.2”);

再如:SSLContext sslContext = SSLContext.getInstance(“TLSv1.2”); 都不行。

还有说是jdk 1.7 才会有这个问题,但是我们的环境本身就是1.8. 看着别人的评论通过这些方法多少都解决了问题,我们是真越发的着急了,

想来想去,三方接口没动,环境也没动,我们本地行,测试环境不行,又觉得是环境问题,又看了一下jdk版本,本地是1.8.0_131,测试环境是1.8.0_45 ,想到会不是这个问题,就把本地jdk做了降级到45 ,可悲的是并没有在本地重现测试环境问题,这时候,我们只能怀疑是网络问题,怎么查呢?抓包。

抓包 下来后,我们对比了本地的包,测试环境的包确实发现些问题,测试环境的包截图如下:
在这里插入图片描述
tcp三次握手后,客户端发了个 Client hello ,但是服务端确返回了,Handshake Failure 问题肯定是出这里,对比这个包,跟正常的包,反复对比后,还是没能看到问题来,于是找到了网络同事,网络同事也是协助一起查看。

终于找到了这么一个帖子:Java加密套件强度限制引起的SSL handshake_failure 我对比了下,情况几乎一样,我把作者查找问题的方法都试了一遍(验证方法可以参考上面的帖子,不再赘余),也都一致,最终我们尝试了作者给出的方法 :

升级jdk到 1.8.0_151和以后的版本,无需下载任何文件,只要修改Java\jre\lib\security\java.security文件

crypto.policy = unlimited

这次真真的问题解决了,在这里也谢谢这位作者!

到这里还没完,这种方式,还是要修改jdk的配置文件,考虑到线上环境都是统一,修改文件会使得jdk变的不统一,我又尝试着找看看有没有更好的办法,果然,又看到另外一个文章:JCE policy changes in Java SE 8u151, 8u152 and 8u162 文章里说“Oracle released Java 8 u162. In this version the unlimited policy is enabled by default. You no longer need to install the policy file in the JRE or set the security property crypto.policy.”

jdk1.8.0_162 之上的版本已经将crypto.policy 默认设置为unlimited 于是我们索性直接将jdk升级到1.8的最终更新Java SE 8u181 到此问题总算处理完了!

这个bug: JDK-8170157

总结一下:

问题的最终解决,算不上自己一步步解决掉,参考了前人的大多文章,这里想说的是解决问题的方法和思路:

1.一定要坚持,好多问题有些同事,上网找找没有办法就不干了

2.先思考,自己解决,处理不了,多上网找找资料,互联可能是会陪伴我们终生的老师,好好借用

3.这里面用到了好多的网络知识,和处理网络问题的办法,比如,tcp,ssl/tls ,Handshake,抓包等等,可能作为一个开发人员会觉得这些离我们很远,我们跟本用不到,只用java 编码就行了,只会crud,能完成开发功能就可以了,我只能说那么你这一辈子也就只能当个初级程序员!!!

遇到一个问题很棘手两天了还没解决掉,报错如下:javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:980) ~[na:1.8.0_45]...
Caused by: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:882) at com.sun.net.s
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake 这个错误网上很多帖子说是jdk版本问题, 我试了不管用 只需要在请求代码前面加上 System.setProperty("https.protocols", "TLSv1"); 这行代码 完美解决 javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:992) at sun.security.ssl.SSLSocketImp
javax.net.ssl.SSLHandshakeException: Remote host closed connection during han 北京某银行信用卡网申开发团队发来协助请求,内容是这样的: 内网中应用服务器要实现某一功能,需要从外网银联端获取一段数据,而内网应用服务器与外网银联服务器的网络是不通的,需要在内网前端配置一台代理服务器,将内网应用与外网银联接通网络,另...
在 C:\ProgramFiles\SmartBear\SoapUI-Pro-5.1.2\bin\SoapUI-Pro-5.1.2.vmoptions 中新增一行代码,代码如下: -Dsoapui.https.protocols=TLSv1.1,TLSv1.2 新增一行代码保存后重启soapui就可以正常对 https 进行请求了。 开发时,需要调用到第三方的web服务接口,出现了这个问题,初次见面,对这个问题有点陌生,因为之前也没有去了解过这一块(毕竟刚出来工作哈) 1、一开始通过搜索大致了解到这个东西大致可能和ssl协议的选择有关,于是去了解用户环境中使用的jdk版本以及第三方服务器的jdk版本。同时,在网络中找到一张图片(侵权私删哈),观察了各版本jdk对应使用的协议 通过...
之前用Android原生可以连阿里云没问题,这边也都是走通的,但是到flutter怎么都连不上,那就解决问题呗,一步一步来: 下载了一个Mqtt.fx把参数都输进去,确保可以连接成功,那真的可能就是mqtt_client这个库的问题了 各种配置检查了好几遍,确定没问题了,但是就是连不通 client.secure = true; flutter: Exception: HandshakeException: Connection terminated during hands
Java7通过httpsURLConnection建立HTTPS连接,异常如下: javax.net.ssl.SSLHandshakeException: Caused by: Remote host closed connection during handshake Caused by: SSL peer shut down incorrectly 解决方案似乎是明显的,客户端需要提高版本...
javax.net.ssl.sslhandshakeexception: 远程主机终止了握手 这个错误通常是由于SSL握手过程中出现了问题,导致远程主机终止了握手。可能的原因包括证书验证失败、协议版本不匹配、加密算法不支持等。需要进一步排查具体原因并进行相应的修复。 ### 回答2: 这个异常是Java中的javax.net.ssl包中的一个异常类型,通常出现在Java程序向SSL加密的服务器发送HTTPS请求时。它表示在SSL握手过程中,远程主机已终止了握手,并且没有能够建立可靠的SSL连接。 造成这个异常的原因可能有多种,例如服务器SSL证书失效、证书不匹配或加密协议不兼容等。以下是一些可能导致此异常的常见原因: 1. SSL证书过期或不匹配:如果服务器SSL证书过期或不匹配,您的Java程序将无法验证该证书并建立安全连接,从而导致此异常。 2. 加密协议或密钥不兼容:如果Java程序和服务器之间使用的SSL加密协议或密钥不兼容,那么握手过程将无法完成,出现此异常。 3. 客户端和服务器之间的网络连接问题:正与服务器通信的可靠性也可能是因为网络连接问题而导致的,例如网络中断、延迟或速度慢等。 解决这个异常,可以采取以下措施: 1. 检查服务器SSL证书的有效性和匹配性,如果SSL证书过期或与域名不匹配,则需要修复或更新SSL证书。 2. 检查Java程序和服务器之间的SSL加密协议或密钥是否兼容,如果不兼容,需要更新加密协议或密钥。 3. 检查客户端和服务器之间的网络连接问题,如果存在网络连接问题,则需要解决网络连接问题以确保安全的SSL连接。 总之,明确异常出现的原因是解决问题的关键,解决办法则需要根据异常的原因来定。只要我们能找出原因,并采取针对性的修复措施,就可以解决这个异常。 ### 回答3: javax.net.ssl.sslhandshakeexception: remote host terminated the handshakeJava中的一个异常。这种异常通常在SSL握手时出现,指远程主机主动断开了握手连接。SSL握手是在客户端和服务器之间建立SSL连接时执行的加密协议,用于协商加密密钥和证书。当远程主机意外终止了握手连接时,Java客户端会抛出javax.net.ssl.sslhandshakeexception异常。 造成javax.net.ssl.sslhandshakeexception异常的原因可能多种多样,例如网络连接问题、协议不匹配、证书验证失败等。具体解决方法如下: 1. 确认网络连接稳定。 在SSL握手时,网络连接的稳定性对于建立连接至关重要。如果网络连接不稳定,可能会导致SSL握手失败。我们可以检查网络连接是否稳定,如果网络连接不稳定,则需要修复网络连接问题。 2. 解决协议不匹配问题。 如果服务器使用的是客户端不支持的协议,则SSL握手将无法建立。我们可以通过升级Java客户端或使用服务器支持的协议来解决此问题。 3. 修复证书验证问题。 如果服务器的证书无法通过验证,则SSL握手失败。在这种情况下,我们可以在服务器上安装最新的证书。如果证书已过期,则需要更新证书。 总之,javax.net.ssl.sslhandshakeexception: remote host terminated the handshakeJava中常见的异常之一。如果出现这个异常,我们需要检查网络连接是否稳定,协议是否匹配,证书是否验证通过,以便解决这个问题。 在配置SSH免密登录时报错:/usr/bin/ssh-copy-id: ERROR: failed to open ID file '/root/.pub': 没有那个文件或目录 weixin_52611570: dependencies.dependency.(groupId:artifactId:type:classifier)' must be unique: 源宇宙烧杯哥: 我来看你翻译了? cvc-complex-type.2.4.a: Invalid content was found starting with element 'threadsafe' hql_1004: 不管你在哪复制的文章,但请你发完之后自己打开看看代码块的内容能看清楚? 服务器常见错误代码500、501、502、503、504、505 Elenaaaaaaaaaa: 您好我想问一下,我们用的服务器是siteground的,现在网站打 不开,然后wordpress后台特无法登录,进入siteground也显示内部服务器错误,请问你可以帮忙解决吗?可以付费,谢谢。