SSL:javax.net.ssl.SSLException: Received fatal alert: protocol_version

调用一个https的接口报错javax.net.ssl.SSLException: Received fatal alert: protocol_version

在Java 1.8上,默认TLS协议是v1.2。在Java 1.6和1.7上,默认是已废弃的TLS1.0,由于此项目使用的是jdk1.6,因此引发错误。

解决方法1:

在发起请求前面设置TLSv1.2协议

    System.setProperty("https.protocols", "TLSv1.2");

解决方法2:

在发起请求前忽略ssl认证:

工具类:

 
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
 
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
 
public class SslUtils {
 
    private static void trustAllHttpsCertificates() throws Exception {
        TrustManager[] trustAllCerts = new TrustManager[1];
        TrustManager tm = new miTM();
        trustAllCerts[0] = tm;
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    }
 
    static class miTM implements TrustManager,X509TrustManager {
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
 
        public boolean isServerTrusted(X509Certificate[] certs) {
            return true;
        }
 
        public boolean isClientTrusted(X509Certificate[] certs) {
            return true;
        }
 
        public void checkServerTrusted(X509Certificate[] certs, String authType)
                throws CertificateException {
            return;
        }
 
        public void checkClientTrusted(X509Certificate[] certs, String authType)
                throws CertificateException {
            return;
        }
    }
     
    /**
     * 忽略HTTPS请求的SSL证书,必须在openConnection之前调用
     * @throws Exception
     */
    public static void ignoreSsl() throws Exception{
        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                return true;
            }
        };
        trustAllHttpsCertificates();
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }
}

使用方法:

public String doHttpGetUTF8(String postUrl,String token) {
        OutputStreamWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(postUrl);
            if("https".equalsIgnoreCase(realUrl.getProtocol())){
               SslUtils.ignoreSsl();
            }
            //打开 url之间的连接
            HttpURLConnection conn = (HttpURLConnection)realUrl.openConnection();
            //设置通用的请求属性
            conn.setRequestMethod("GET");
            conn.setUseCaches(false);
            conn.setRequestProperty("Accept-Charset", "utf-8");
            conn.setRequestProperty("contentType", "utf-8");
            conn.setRequestProperty("Content-Type", "application/x‑www‑form‑urlencoded");
            conn.setRequestProperty("Authorization", "Bearer "+token);
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            long start = System.currentTimeMillis();
            //获取 URLConnection对象输出对应的输出流
 
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));
            long end = System.currentTimeMillis();
            
            String line;
            while (null != (line = in.readLine())) {
                result += "\n" + line;
            }
            //建立
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输出流、输入流
        finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return result;
    }

建立连接之前调用该方法即可

解决方法3:

在项目中同时配置jdk1.6和jdk1.8

我用的方法3,方法1和方法2没有起作用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/18621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue中的常用指令

Vue 会根据不同的【指令】,针对标签实现不同的【功能】 概念:指令(Directives)是 Vue 提供的带有 v- 前缀 的 特殊 标签属性。 为啥要学:提高程序员操作 DOM 的效率。 vue 中的指令按照不同的用途可以分为如下 6 大…

【Unity iOS打包】Library not loaded: ‘@rpath/AdjustSdk.framework/AdjustSdk‘

Unity打包iOS,XCode运行App黑屏卡死,报错: dyld[8412]: Library not loaded: rpath/AdjustSdk.framework/AdjustSdkReferenced from: /private/var/containers/Bundle/Application/C019F943-138F-4B33-AAC1-F18453F942D9/AnimalsBAMBAM.app/…

C++模板特化与偏特化 template <>的含义

C++模板特化 C++模板特化是模板编程中的一个强大特性,它允许程序员为特定的类型或模板参数提供定制化的实现(举个例子,即如果T类型是int类型时候,想要专门的函数实现)。以下是一些C++模板特化的例子: 模板特化(Template Specialization)是模板编程的一个特性,它允许…

采用Java+ SpringBoot+ IntelliJ+idea开发的ADR药物不良反应监测系统源码

采用Java SpringBoot IntelliJidea开发的ADR药物不良反应监测系统源码 ADR药物不良反应监测系统有哪些应用场景? ADR药物不良反应监测系统有哪些应用场景? ADR药物不良反应监测系统具有广泛的应用场景,以下是一些主要的应用场景&#xff1a…

发现一个可以白嫖GPU的平台

网址 https://platform.virtaicloud.com/gemini_web/auth/register?inviteCodeb0322161368ead7f49716688486796dd 驱动云注册有100点的算力点,目前最便宜的机器大概是0.49算力点每小时,安装个sd或者简单学习训练数据的话,应该能用挺久的。…

富格林:可信计策防止诱导被骗

富格林指出,现货黄金是一种大众化的投资选择,很多投资者会选择进入黄金市场进行交易。现货黄金因其灵活的交易方式和双向交易方式,为投资者提供了更多的获利机会,但是,黄金投资者要想盈利,这与投资者的交易…

低延迟更灵活,开发者怎能不爱分布式云

为了努力部署和管理复杂的数据密集型应用程序,从而满足客户不断变化的需求,我们需要一种方法让这些应用程序和工作负载更接近位于全球任意一个角落的客户。过去多年来,云计算满足了这种需求。不过这就够了吗?适合过去的东西&#…

代码随想录-算法训练营day54【动态规划15:判断子序列、不同的子序列】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第九章 动态规划part15● 392.判断子序列 ● 115.不同的子序列 详细布置 392.判断子序列 这道题目算是 编辑距离问题 的入门题目(毕竟这里只是涉及到减法),慢慢的,后面就要来解决真正的 编辑距离问题了https://p…

[C#]使用C#部署yolov8-seg的实例分割的tensorrt模型

【测试通过环境】 win10 x64 vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super 版本和上述环境版本不一样的需要重新编译TensorRtExtern.dll,TensorRtExtern源码地址:TensorRT-CShar…

【豆伴匠】L1-L12更新完,一站式解决文史积累、阅读、写作难题,弯道超车,寒假必备

合抱之木,生于毫末; 九层之台,起于垒土; 千里之行,始于足下。 豆伴匠是什么? 豆伴匠内容包括:人、文、史、作四个模块,全面覆盖文史知识及读写技巧。 目前,豆伴匠有L…

【408真题】2009-24

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…

[C++]红黑树

一、概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路 径会比其他路径长出俩倍,因而是…

每日一读: 硬件网卡tx支持哪些功能特性offload(ixgbe驱动为例)

ixgbe驱动 rte_eth_dev_info_get -> ixgbe_dev_info_get -> ixgbe_get_tx_port_offloads uint64_t ixgbe_get_tx_port_offloads(struct rte_eth_dev *dev) {uint64_t tx_offload_capa;struct ixgbe_hw *hw IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);tx_…

CIM分级

定义 以建筑信息模型(BIM)、地理信息系统(GIS)、物联网(IoT)等技术为基础,整合城市地上地下、室内室外、历史现状未来多维多尺度信息模型数据和城市感知数据,构建起三维数字空间的城…

c/c++:离开停车场

题目描述(题目链接) 你被困在一个多层停车场。您的任务是仅使用楼梯离开停车场。出口总是在一楼的右下角。 创建一个采用矩阵的函数,其中: 0 表示免费停车位。 1 表示楼梯。 2 表示您的起始位置,可以在停车场的任何一层。 出口总…

面试问到Spring中的@Autowired注解,可以这样答

前言 在Spring框架中,依赖注入是一个核心概念,它允许将一个对象的依赖关系外部化并由Spring容器来管理。Autowired注解是实现这一点的关键工具之一。当然,这块知识也是面试官们老生常谈的问题。 下面就跟着博主的步伐,一起来探讨…

GCANet去雾算法

目录 1. 引言 2. 门控上下文注意机制(GCA) 3. 去雾流程 4. 模型代码 5. GCANet的优势 6. 去雾效果 1. 引言 GCANet(Gate-Controlled Attention Network)是一种用于图像去雾的深度学习算法,通过引入注意力机制来改进传统的去雾方法&…

C#实现纳秒级的计时器功能

常用的 Windows API 方法 GetTickCount() 返回系统启动后经过的毫秒数。另一方面,GetTickCount() 函数仅有 1ms 的分辨精度,精度也很不好。 我们要另外寻找一种方法来精确测量时间。 Win32 API 使用 QueryPerformanceCounter() 和 QueryPerformanceFre…

大模型场景应用汇总(持续更新)

一、应用场景 1.办公场景 智能办公:文案生成(协助构建大纲优化表达内容生成)、PPT美化(自动排版演讲备注生成PPT)、数据分析(生成公式数据处理表格生成)。 智能会议:会议策划&…

P10442 「MYOI-R3」字符串

「MYOI-R3」字符串 题目描述 给定字符串 s , t s,t s,t。 现在你要在 s , t s,t s,t 中删除一些字符并将它们重新排列使 s t st st。 问操作后的 ∣ s ∣ |s| ∣s∣(即字符串 s s s 的长度)最大是多少? 输入格式 第一行一个字符串…