解决JDK7调用https报:java.net.SocketException: Connection reset错误

这篇具有很好参考价值的文章主要介绍了解决JDK7调用https报:java.net.SocketException: Connection reset错误。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原因分析:

        大多数现代的 HTTPS 连接将使用 TLS 1.2协议 或 TLS 1.3协议,具体取决于服务器和客户端支持的版本以及其之间的协商,而JDK7及以下版本默认使用是TLS v1协议,所以在调用HTTPS接口时,会出现java.net.SocketException: Connection reset报错;

        下面是不同JDK版本的默认TLS协议:

JDK 6
    SSL v3
    TLS v1(默认)
    TLS v1.1(JDK6 update 111 及以上)
JDK 7
    SSLv3
    TLS v1(默认)
    TLS v1.1
    TLS v1.2
JDK 8
    SSL v3
    TLS v1
    TLS v1.1
    TLS v1.2(默认)

解决方案:

        手动设置TLS协议为v1.2版本,下面我提供了POST+JSON+用户认证请求(如果不需要用户认证的,可以去掉)代码示例供参考:文章来源地址https://www.toymoban.com/news/detail-858366.html

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class HttpClientUtils {


    public static void main(String[] args) {
        try {
            String path = "https://XXXXXXXXXX";
            JSONObject param = new JSONObject();
            param.put("param1", "参数1");
            param.put("param2", "参数2");
            String resStr = HttpClientUtils.sendHttpsPostTLSAdd(path, param.toJSONString(), "用户账号", "用户密码", "UTF-8");
            System.out.println(resStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * post请求,设置TLS协议
     * @param url
     * @param json
     * @param username 用户名
     * @param password 密码
     * @param charSet 请求编码(UTF-8)
     * @return
     * @throws Exception
     */
    public static String sendHttpsPostTLSAdd(String url, String json, String username, String password, String charSet) throws Exception {
        // 实现一个X509TrustManager接口,用于绕过验证,不用修改里面的方法
        X509TrustManager trustManager = new X509TrustManager() {
            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            @Override
            public void checkClientTrusted(X509Certificate[] arg0, String arg1)
                    throws CertificateException {

            }

            @Override
            public void checkServerTrusted(X509Certificate[] arg0, String arg1)
                    throws CertificateException {

            }

        };

        // 设置TLS协议版本为TLSv1.2
        SSLContext sc = SSLContext.getInstance("TLSv1.2");
        sc.init(null, new TrustManager[] { trustManager }, null);
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sc);

        // 得到httpClient对象
        CloseableHttpClient httpClient = null;
        HttpPost httpPost = null;
        String result = null;
        httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
        httpPost = new HttpPost(url);

        // 用户认证
        String authString = username + ":" + password;
        String encodedAuthString = Base64.encodeBase64String(authString.getBytes());
        httpPost.setHeader("Authorization", "Basic " + encodedAuthString);

        // 推送配置
        StringEntity entity = new StringEntity(json, charSet);
        entity.setContentEncoding(charSet); // 设置编码格式
        entity.setContentType("application/json"); // 设置JSON请求
        httpPost.setEntity(entity);
        // 执行
        HttpResponse response = httpClient.execute(httpPost);
        if (response != null) {
            HttpEntity resEntity = response.getEntity();
            if (resEntity != null) {
                result = EntityUtils.toString(resEntity, charSet);
            }
        }

        return result;
    }
}

到了这里,关于解决JDK7调用https报:java.net.SocketException: Connection reset错误的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【java安全】原生反序列化利用链JDK7u21

    前言 前面我们学习了使用第三方类: Common-Collections 、 Common-Beanutils 进行反序列化利用。我们肯定会想,如果不利用第三方类库,能否进行反序列化利用链呢?这里还真有:JDK7u21。但是只适用于java 7u及以前的版本 在使用这条利用链时,需要设置jdk为jdk7u21 原理 JDK7u21这条链利

    2024年02月14日
    浏览(41)
  • java.net.SocketException: Broken pipe原因

    服务端日志中发现 若干条异常 在抛出上述异常时可能还有 Connect reset by peer 异常, 在客户端和服务端建立socket连接后,一方突然掉线/关闭通道,一方还在持续读取或者写入数据就会触发这个异常。触发 Connect reset by peer 后继续写入/读取数据则会抛出 Broken pipe 异常 这个异常简

    2024年02月12日
    浏览(87)
  • 解决问题: java.net.ConnectException: Connection refused: connect

    问题描述: 使用hive连接三方工具datagrip的时候出现错误: Could not open client transport with JDBC Uri: jdbc:hive2://hadoop:10000: java.net.ConnectException: Connection refused: connect 解决过程: 首先通过查阅网上资料,排除了以下原因: 1、防火墙 2、Hadoop中hdfs、yarn的启动 3、开启metastore和hiveServer

    2024年02月16日
    浏览(41)
  • java.net.ConnectException: Connection refused: connect已解决

    🥚今日鸡汤🥚         要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。                                                                                                                       —— 《枫》 遇见问题莫着急,着

    2024年02月02日
    浏览(46)
  • Unable to open debugger port (127.0.0.1:13928):java.net.SocketException “

    Unable to open debugger port (127.0.0.1:13928):java.net.SocketException “Interrupted function call: accept failed” 一、问题描述 准备debug启动项目时,报标题错误。 二、原因分析 出现这个报错的原因是因为端口被占用导致的。 三、解决办法 解决方法:关闭占用端口的进程。 第一步:cmd打开命令行窗

    2024年02月03日
    浏览(49)
  • java.net.SocketException: No buffer space available (maximum connections reached?): connect

            最近,有项目反馈调用第三方接口失败,查不到数据。现场用soapUI工具试了下,点执行按钮,一闪而过,接口没有任何返回值。一开始以为是第三方服务问题,后来查看日志,发现是自己的问题,报错如下:         Caused by: java.net.SocketException: No buffer space av

    2024年02月16日
    浏览(36)
  • 【已解决】解决Finalshell连接Linux报错java.net.ConnectException: Connection refused: connect

     错误提示:java.net.ConnectException: Connection time out: connect 解决办法:重新启动系统SSH服务   如linux输入  #service sshd restart

    2024年02月14日
    浏览(48)
  • java.net.ConnectException: Connection refused: no further information【已解决】

     报错如下: 原因 :端口不一致,客户端无法访问服务端 解决方法 :把客户端的端口改成服务端一致的端口 ok,大功告成 。 8020端口: 8020端口在Hadoop1.x中默认承担着Namenode 和 Datanode之间的心跳通信,也兼顾FileSystem默认的端口号(Hdfs客户端访问Hdfs集群的RPC通信端口), 但是在

    2024年02月16日
    浏览(44)
  • Finalshell(SSH)连接虚拟机超时java.net.ConnectException: Connection refused【已解决】

    最近学习Liunx,连接虚拟机一直超时,出现的问题查了一晚上解决了,自己记录一下防止忘记。(如果需要安装包的可以留言) 1.虚拟机ip网段和本机ip网段不相同 2.网络设配器异常需要更新驱动、 解决办法 开启桥接模式 在这里注意不要选自动并且需要和你主机连接的对应

    2024年02月11日
    浏览(48)
  • 正确解决finalshell连接虚拟机报错:java.net.ConnectException: Connection refused: connect

    博客主页:Skylar Lin 望本文能够给您带来一定的帮助,如果有错误的地方敬请斧正! 新人博主🧑,希望多多支持🍺,还有好多库存和大家分享🎁。 转载需注明出处和原作🌹。 从大二上学期就下载了 finalshell,不过当时一直连接不上 virtualbox 的虚拟机,网上找了好几篇文章

    2024年02月06日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包