安卓4.X版本ssl: sslv3 alert handshake failure 握手失败

news2024/11/18 13:51:40

低版本https握手失败

  • 错误
  • 查看接口的协议
  • 改写代码(网络访问采用原生的HttpsURLConnection)

参考博文:
https://www.cnblogs.com/lwbqqyumidi/p/12063489.html
https://blog.csdn.net/qq_16117167/article/details/52621112

错误

如图所示,访问接口的时候,错误写着sslv3报握手错误,然后查了网上的说法就是协议不对,因为低版本的默认用的协议是ssl3之类的协议。但是它其实支持TLS1.1或者TLS1.2的,只是需要手动去写。
在这里插入图片描述

查看接口的协议

测试网址:https://www.ssllabs.com/ssltest/index.html
这个网页里面,把接口的地址放进去分析
分析结果:
在这里插入图片描述
所以确实是不支持的,支持TLS1.1,TLS1.2之类的协议。

改写代码(网络访问采用原生的HttpsURLConnection)

最主要的是sslSocketFactory改写,改写这个的话就要重写SSLSocketFactory。

package com.rengda.sigangapp

import java.net.InetAddress
import java.net.Socket
import java.security.cert.X509Certificate
import javax.net.ssl.SSLContext
import javax.net.ssl.SSLSocket
import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.X509TrustManager

class MySSLSocketFactory(): SSLSocketFactory() {
     var internalSSLSocketFactory:SSLSocketFactory
     var context: SSLContext

    init {
        context = SSLContext.getInstance("TLSv1.1")
        context.init(null, null, null)
        internalSSLSocketFactory=context.socketFactory
    }


    override fun getDefaultCipherSuites(): Array<String> {
        return internalSSLSocketFactory.getDefaultCipherSuites()
    }

    override fun createSocket(s: Socket?, host: String?, port: Int, autoClose: Boolean): Socket {
        val sslSocket=context?.getSocketFactory()?.createSocket(s, host, port, autoClose) as SSLSocket
        sslSocket.setEnabledProtocols(arrayOf("TLSv1.2","TLSv1.1"))
        return sslSocket;
    }

    override fun getSupportedCipherSuites(): Array<String> {
        return internalSSLSocketFactory.getSupportedCipherSuites();
    }

    override fun createSocket(): Socket {
        return super.createSocket()
    }

    override fun createSocket(host: String?, port: Int): Socket {
        val sslSocket=context?.getSocketFactory()?.createSocket( host, port) as SSLSocket
        sslSocket.setEnabledProtocols(arrayOf("TLSv1.2","TLSv1.1"))
        return sslSocket;
    }

    override fun createSocket(host: String?, port: Int, localHost: InetAddress?, localPort: Int): Socket {
        val sslSocket=context?.getSocketFactory()?.createSocket(host, port, localHost, localPort) as SSLSocket
        sslSocket.setEnabledProtocols(arrayOf("TLSv1.2","TLSv1.1"))
        return sslSocket;
    }

    override fun createSocket(host: InetAddress?, port: Int): Socket {
        val sslSocket=context?.getSocketFactory()?.createSocket(host, port) as SSLSocket
        sslSocket.setEnabledProtocols(arrayOf("TLSv1.2","TLSv1.1"))
        return sslSocket;
    }

    override fun createSocket(address: InetAddress?, port: Int, localAddress: InetAddress?, localPort: Int): Socket {
        val sslSocket=context?.getSocketFactory()?.createSocket(address, port, localAddress, localPort) as SSLSocket
        sslSocket.setEnabledProtocols(arrayOf("TLSv1.2","TLSv1.1"))
        return sslSocket;
    }
}

在用HttpsURLConnection的地方用自己的SSLSocketFactory,片段代码如下 connection.sslSocketFactory= MySSLSocketFactory() 这句就是关键。

         var connection: HttpsURLConnection? = null
        val url = URL(url)
        connection = url.openConnection() as HttpsURLConnection
        connection.connectTimeout = 10000
        connection.readTimeout = 10000
        connection.requestMethod = "GET"
        connection.sslSocketFactory= MySSLSocketFactory()

这样之后就可以访问了

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

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

相关文章

linux进程概念

目录 1、进程的基本概念 2、进程控制块 - PCB task_struct内容分类 3、查看进程 通过ps命令查看进程 通过proc查看进程 4、通过系统调用获取进程标示符 5、通过系统调用创建进程-fork初识 6、进程状态 操作系统进程状态 linux进程状态 僵尸进程 孤儿进程 僵尸进…

计算机网络-谢希仁-第7版 第1章 概述

计算机网络-谢希仁-第7版 第1章 概述1.011.021.031.071.081.091.101.111.121.131.141.161.171.181.191.201.211.221.241.251.26计算机网络谢希仁版&#xff08;第七版&#xff09;答案 1.01 计算机网络可以向用户提供哪些服务&#xff1f; 计算机网络使用户在计算机之间传送数…

【Linux】Linux下的编译器——gcc/g++

&#x1f4ac;推荐一款模拟面试、刷题神器 、从基础到大厂面试题&#xff1a;&#x1f449;点击跳转刷题网站进行注册学习 目录 一、编译的过程 1、预处理阶段 1.1预处理的工作——头文件展开、去注释、宏替换、条件编译 1.2外部定义宏&#xff08;-D选项&#xff09; 1.…

会话跟踪技术(Cookie、Session)

目录一、CookieCookie的基本使用发送Cookie获取CookieCookie原理Cookie使用细节二、SessionSession基本使用Session原理Session使用细节三、小结四、登录注册案例会话&#xff1a;用户打开浏览器&#xff0c;访问Web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断开…

数据结构之堆的应用

系列文章目录 数据结构之堆_crazy_xieyi的博客-CSDN博客 文章目录 前言一、Top-k问题 1.前K个最小数&#xff08;第k个最小数&#xff09; 2.前K个最大数&#xff08;第K个最大数&#xff09;二、堆排序 1.从小到大排序&#xff08;建大根堆&#xff09;2.从大到…

【2022研电赛】安谋科技企业命题一等奖:基于EAIDK-610的中国象棋机器人对弈系统

本文为2022年第十七届中国研究生电子设计竞赛安谋科技企业命题一等奖作品分享&#xff0c;参加极术社区的【有奖活动】分享2022研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&#xff01; 基于EAIDK-610的中国象棋机器人对弈系统 参赛单位&#xff1a;西安邮电大学…

硬件开发趋势与技术探索

LiveVideoStackCon 2022 音视频技术大会 北京站将于11月25日至26日在北京丽亭华苑酒店召开&#xff0c;本次大会将延续【音视频无限可能】的主题&#xff0c;邀请业内众多企业及专家学者&#xff0c;将他们在过去一年乃至更长时间里对音视频在更多领域和场景下应用的探索、在实…

2023届C/C++软件开发工程师校招面试常问知识点复盘Part 8

目录52、vector<string>是怎么存储的&#xff1f;53、epoll的底层原理53.1 对比select和poll53.2 ET和LT的工作模式54、进程、线程、协程的理解和他们的通信方式54.1 进程的含义54.2 线程的含义54.3 协程的含义54.4 进程间通信IPC54.5 线程间通信方式55、define宏定义的用…

【JavaDS】优先级队列(PriorityQueue),堆,Top-k问题

✨博客主页: 心荣~ ✨系列专栏:【Java实现数据结构】 ✨一句短话: 难在坚持,贵在坚持,成在坚持! 文章目录一. 堆1. 堆的概念2. 堆的存储方式3. 堆的创建4. 元素入堆5. 元素出堆6. 获取堆中元素二. 优先级堆列(PriorityQueue)1. 优先级队列2. PriorityQueue的特性3. 集合框架中P…

万字启程——零基础~前端工程师_养成之路001篇

目录 什么是前端 什么是后端 前端和后端的区别 前端工程师职责 后端工程师职责 前端的核心技术 HTML CSS JavaScript RESTful结构 特点 HTTP请求方式有哪些 目前最火的前端框架Vue vue优点 vue的响应式编程、组件化 搭建编程环境 什么是编程环境 前端的编程环…

华为云CDN,海量资源智能路由,让内容传输更快一步

华为云CDN,海量资源智能路由,让内容传输更快一步 云服务对于我们生活的影响已经愈发深入&#xff0c;在数字化转型的大背景下&#xff0c;城市管理、公共交通、医疗健康等领域都需要云服务的支持。华为云作为国内知名的云服务平台&#xff0c;以技术强、更可靠、资源多以及帮肋…

基于CentOS 7.9操作系统应用httpd配置本地镜像(本地yum源)

记录&#xff1a;301 场景&#xff1a;配置离线本地镜像源(本地yum源)的三种方式&#xff1a;直接使用iso镜像包配置、使用httpd服务应用iso镜像包配置、使用httpd服务应用rpm包配置。在内网环境或者局域网环境&#xff0c;基于CentOS 7.9操作系统应用httpd配置本地镜像(本地y…

手把手带你玩转Spark机器学习-深度学习在Spark上的应用

系列文章目录 手把手带你玩转Spark机器学习-专栏介绍手把手带你玩转Spark机器学习-问题汇总手把手带你玩转Spark机器学习-Spark的安装及使用手把手带你玩转Spark机器学习-使用Spark进行数据处理和数据转换手把手带你玩转Spark机器学习-使用Spark构建分类模型手把手带你玩转Spa…

Python学习笔记(十三)——编译错误和异常处理

异常和异常类 Python常见错误 语法错误 源代码存在拼写语法错 误&#xff0c;这些错误导致Python 编译器无法把Python源代 码转换为字节码&#xff0c;故也称 之为编译错误。>>> print("我爱山大"} SyntaxError: invalid syntax 运行时错误 • 程序中没有…

Python常用库1:collections,容器数据类型

collections&#xff1a;数据容器 点这里跳到原文地址。预计阅读时长&#xff1a;10分钟未完待续&#xff0c;遇到相关力扣题目&#xff0c;会继续补充~ 文章目录前言一、Collections中的内置函数二、各个函数的使用1. deque1.1 deque的介绍1.2 deque支持的方法1.3 使用deque解…

js-键盘事件

onkeydown:按键被按下 onkeyup:按键被松开 事件绑定的对象&#xff1a;键盘事件一般绑定给可以获取焦点的对象或者document对象 焦点&#xff1a;光标在闪的&#xff1a;比如input标签 如果一直按按键不松手&#xff0c;按键会一直被触发 当&#xff1a;onkeydown连续触发时…

THREE.JS实现看房自由(VR看房)

VR看房一、前言二、基础知识三、场景3.1 网络模型3.2 光照3.2.1 环境光3.2.2 平行光3.2.3 点光源3.2.4 聚光灯3.2.5 半球光四、相机4.1 正交相机4.2 透视相机五、渲染器六、贴图纹理6.1 基础介绍6.2 环境贴图6.3 HDR处理七、拓展7.1 坐标系7.2 控制器7.3 自适应7.4 全屏响应7.5…

C#基础·补丁

文章目录一 命名空间二字符串2.1 System.String类2.2 StringBuilder类三 正则表达式3.1 什么是正则表达式&#xff1f;3.2 查找举例3.3 重复描述字符举例3.4 反义字符3.5 基本语法元字符3.6 定位元字符3.7 择一匹配3.8 分组一 命名空间 二字符串 字符串类 System.String(strin…

python数据分析之numpy

数据分析之Numpy 1、Numpy的数组对象及其索引 import numpy as npimport numpy as npanp.array([1,2,3,4]) print(a) bnp.array([2,3,4,5]) print(b)print(ab)产生数组 从列表产生数组&#xff1a; list_array[1,2,3,4] anp.array(list_array) print(a)从列表传入&#xff…

PCB设计很简单?生产问题才是考验工程师能力的标准!

BOM清单有误 SMT产线&#xff1a;物料封装怎么和PCB焊盘不一致呢&#xff1f;停线排查。 仓库&#xff1a;我是按照BOM清单发的物料。 硬件研发&#xff1a;哎&#xff0c;BOM整理时马虎了。 过孔焊盘问题 “ 连锡问题 产线维修&#xff1a;怎么这么多连锡导致不良的产品&…