当前位置: 首页 > article >正文

OkHttp 的证书设置

在 Android 开发中,通过 OkHttp 自定义 SSLSocketFactory 和 X509TrustManager 可以有效增强 HTTPS 通信的安全性,防止中间人攻击(如抓包工具 Charles/Fiddler 的拦截)。以下是实现防抓包的关键技术方案:

一、Okhttp设置固定证书(推荐)

OkHttp 内置了证书固定功能,无需自定义 SSLSocketFactory,直接配置即可

         val certificatePinner = CertificatePinner.Builder().add("example.com:443", "sha256/+o+LjQ5sWk3ABG4Gl7yZib6xTZ6F7OQ09qW7P9G+Z/Y=").build()httpClient.certificatePinner(certificatePinner)

1、example.com: OpenSSL 要连接的 HTTPS 服务域名,你需要替换为实际的目标域名

2、443: 是 HTTPS 协议的默认端口号,若服务器 HTTPS 端口自己设置的,则需要修改

3、sha256/******: OpenSSL 获取到的证书

1、获取证书(服务器证书的公钥 SHA256 哈希值)

 在终端运行以下命令获取证书

openssl s_client -connect example.com:443 | openssl x509 -pubkey | openssl pkey -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64
  1. 连接到服务器openssl s_client -connect example.com:443 建立与目标服务器的 SSL 连接。注意⚠️:example.com:443 替换为你实际要连接的服务器地址和端口

  2. 提取证书openssl x509 -pubkey 从连接中提取证书的公钥部分。

  3. 转换格式openssl pkey -pubin -outform der 将公钥转换为 DER 格式(二进制)。

  4. 计算哈希openssl dgst -sha256 -binary 计算 DER 格式公钥的 SHA256 哈希。

  5. Base64 编码openssl enc -base64 将二进制哈希值转换为 Base64 字符串。

二、自定义 SSLSocketFactory + X509TrustManager

          如果需要更细粒度的控制(如仅信任特定证书)

1. 创建自定义 TrustManager
class CustomTrustManager : X509TrustManager {private val trustedCertificates by lazy { loadTrustedCertificates() }private fun loadTrustedCertificates(): List<X509Certificate> {// 从 assets 或 raw 目录加载证书(如 .crt 或 .pem 文件)val inputStream = context.assets.open("certificate.crt")val certificateFactory = CertificateFactory.getInstance("X.509")return certificateFactory.generateCertificate(inputStream) as X509Certificate}override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {// 客户端证书验证throw CertificateException("Client certificates not supported!")}override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {// 验证服务器证书链是否与预置证书匹配if (!trustedCertificates.contains(chain[0])) {throw CertificateException("Untrusted server certificate!")}}override fun getAcceptedIssuers(): Array<X509Certificate> = arrayOf()
}

    2. 创建自定义 SSLSocketFactory   

class CustomSSLSocketFactory(private val trustManager: X509TrustManager) : SSLSocketFactory() {private val sslContext by lazy {SSLContext.getInstance("TLS").apply {init(null, arrayOf(trustManager), SecureRandom())}}override fun createSocket(s: Socket, host: String, port: Int, autoClose: Boolean): Socket {return sslContext.socketFactory.createSocket(s, host, port, autoClose)}// 其他重写方法(直接委托给 sslContext.socketFactory)override fun getDefaultCipherSuites(): Array<String> {sslContext.socketFactory.defaultCipherSuites}override fun getSupportedCipherSuites(): Array<String> {sslContext.socketFactory.supportedCipherSuites}override fun createSocket(host: String, port: Int): Socket {sslContext.socketFactory.createSocket(host, port)}override fun createSocket(host: String, port: Int, localHost: InetAddress, localPort: Int): Socket {sslContext.socketFactory.createSocket(host, port, localHost, localPort)}override fun createSocket(address: InetAddress, port: Int): Socket {sslContext.socketFactory.createSocket(address, port)}override fun createSocket(address: InetAddress, port: Int, localAddress: InetAddress, localPort: Int): Socket {sslContext.socketFactory.createSocket(address, port, localAddress, localPort)}}
3. 配置 OkHttpClient
 val trustManager = CustomTrustManager()val sslSocketFactory = CustomSSLSocketFactory(trustManager)val okHttpClient =OkHttpClient.Builder().sslSocketFactory(sslSocketFactory, trustManager).hostnameVerifier { hostname, session ->HttpsURLConnection.getDefaultHostnameVerifier().verify(hostname, session)}.build()

相关文章:

OkHttp 的证书设置

在 Android 开发中&#xff0c;通过 OkHttp 自定义 SSLSocketFactory 和 X509TrustManager 可以有效增强 HTTPS 通信的安全性&#xff0c;防止中间人攻击&#xff08;如抓包工具 Charles/Fiddler 的拦截&#xff09;。以下是实现防抓包的关键技术方案&#xff1a; 一、Okhttp设…...

机器视觉工程师如何学习C#通讯

建议大家可以提前测试&#xff0c;真实模拟现场的情况&#xff0c;或者采用虚拟串口&#xff0c;虚拟网口频繁测试通讯的稳定性&#xff0c;以后有现场需要&#xff0c;可以快速布局到现场。 机器视觉工程师学习C#通讯协议需要结合工业场景需求&#xff0c;掌握基础协议原理、常…...

数字电子技术会被淘汰吗?模拟电子技术的未来发展与应用

引言 当今世界正处在数字电子技术飞速发展的时代。自上世纪中叶以来&#xff0c;集成电路中的晶体管数量按照摩尔定律呈指数级增长&#xff0c;计算设备性能大幅提升。一个典型例子是&#xff0c;我们口袋中的智能手机拥有的运算能力远超早期计算机&#xff1a;iPhone 14的处理…...

基于yolov8+streamlit实现目标检测系统带漂亮登录界面

【项目介绍】 基于YOLOv8和Streamlit实现的目标检测系统&#xff0c;结合了YOLOv8先进的目标检测能力与Streamlit快速构建交互式Web应用的优势&#xff0c;为用户提供了一个功能强大且操作简便的目标检测平台。该系统不仅具备高精度的目标检测功能&#xff0c;还拥有一个漂亮且…...

软件性能测试与功能测试联系和区别

随着软件开发技术的迅猛发展&#xff0c;软件性能测试和功能测试成为了确保软件质量的两个重要环节。那么只有一字之差的性能测试和功能测试分别是什么?又有哪些联系和区别呢? 一、软件性能测试是什么?   软件性能测试是为了评估软件系统在特定条件下的表现&#xff0c;包…...

交易系统【三】网关

第二章本来是要讲消息总线&#xff0c;审核说是过度宣传&#xff0c;就放弃了&#xff0c;不纠结&#xff0c;先跳过。 网关和消息总线的底层技术都和网络相关&#xff0c;两者也有很重要的差别。消息总线主要用于内网&#xff0c;受交换机和网卡影响比较大&#xff0c;网络状…...

Axure设计之堆叠柱状图教程(中继器)

堆叠柱状图是一种常用的数据可视化工具&#xff0c;它通过在同一柱状图内堆叠不同类别的数据&#xff0c;以展示每个类别在总体中的贡献或占比。堆叠柱状图不仅可以帮助我们观察数据的总量&#xff0c;还能清晰地揭示各部分之间的关系和变化趋势。以下是一个使用Axure制作动态效…...

antd的Form表单校验的方式有几种

Ant Design 的 Form 组件提供了多种灵活的表单校验方式&#xff0c;以下是常见的几种方法及示例&#xff1a; 1. 内置校验规则 通过 rules 配置预定义的校验规则&#xff08;如必填、长度、格式等&#xff09;。 <Form.Itemname"email"label"邮箱"rul…...

前端面试:React hooks 调用是可以写在 if 语句里面吗?

在 React 中&#xff0c;Hooks 是一种新的特性&#xff0c;允许你在函数组件中使用状态&#xff08;state&#xff09;和其他 React 特性。非常重要的一点是&#xff0c;React Hooks 必须遵循特定的规则&#xff0c;以确保组件的行为一致。 React Hooks 使用规则 只能在函数组…...

本地部署Hive集群

规划 服务机器Hive本体部署在Node1元数据服务所需的关系型数据库(MYSQL)部署在Node1 安装MYSQL数据库 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安装Mysql yum库 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.…...

CNN的激活函数

我们来对比 Sigmoid、Softmax 和 ReLU 这三种激活函数的相同点和不同点&#xff0c;并分别说明它们相较于其他两种激活函数的优点。 相同点 都是非线性激活函数&#xff1a; 这三种激活函数都能为神经网络引入非线性特性&#xff0c;使网络能够学习复杂的模式。 广泛应用于深度…...

【愚公系列】《高效使用DeepSeek》001-什么是DeepSeek

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...

零成本本地化搭建开源AI神器LocalAI支持CPU推理运行部署方案

文章目录 前言1. Docker部署2. 简单使用演示3. 安装cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 嘿&#xff0c;小伙伴们&#xff01;今天给大家带来一个超酷的黑科技——LocalAI。没错&#xff0c;你没听错&#xff0c;就是那个能在你的个人电脑上运行大型语言模…...

Visual Studio Code 基本使用指南

Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的免费、开源、跨平台的代码编辑器&#xff0c;凭借其轻量级设计、丰富的插件生态和强大的功能&#xff0c;成为全球开发者的首选工具。本文将从安装配置到核心功能&#xff0c;全面解析 VSCode 的基本使…...

git使用命令总结

文章目录 Git 复制创建提交步骤Git 全局设置:创建 git 仓库:已有仓库? 遇到问题解决办法&#xff1a;问题一先git pull一下&#xff0c;具体流程为以下几步&#xff1a; 详细步骤 Git 复制 git clone -b RobotModelSetting/develop https://gitlab.123/PROJECT/123.git创建提…...

内容中台的核心架构是什么?

模块化架构设计解析 内容中台的模块化架构通过分层解耦实现灵活扩展&#xff0c;其核心由基础资源层、能力服务层与业务应用层构成。基础层以统一数据治理体系为支撑&#xff0c;通过标准化接口实现结构化与非结构化数据的统一存储&#xff0c;例如Baklib采用分布式存储架构保…...

【小白向】Ubuntu|VMware 新建虚拟机后打开 SSH 服务、在主机上安装vscode并连接、配置 git 的 ssh

常常有人问VMware-Tools装了也复制粘贴不了怎么办&#xff0c;这个东西影响因素太多了&#xff0c;具体解决办法你们可以参考一下&#xff1a;【经验】VMware&#xff5c;虚拟机只能使用鼠标无法使用键盘、装不了或装了VMware-Tools无法复制粘贴的可能解决办法_增强型键盘驱动程…...

深度学习 bert与Transformer的区别联系

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;和Transformer都是现代自然语言处理&#xff08;NLP&#xff09;中的重要概念&#xff0c;但它们代表不同的层面。理解这两者之间的区别与联系有助于更好地掌握它们在NLP任务中的应用。 …...

bootloader相关部分

简单说明 程序烧录的方式主要有ICP,ISP,IAP 其中ICP就是常用的jlink等工具 ISP就是利用MCU自带的一些特殊引脚烧录&#xff0c;比如uart IAP就是利用用户写的bootloader代码烧录 bootloader主要分为三层&#xff0c;厂家出厂的bootrom ,用户自己写的bootloader&#xff0c;…...

idea cpu干到100%的解决方法?

一、环境信息 idea版本: IntelliJ IDEA 2024.1.7 (Ultimate Edition) jdk版本: 1.8 操作系统版本: win10 二、解决办法 Help >> Change Memory Settings设置成2048M后重启idea 三、说明 idea将cpu打满后电脑会相当卡顿&#xff0c;Change Memory Settings后idea内…...

【 Fail2ban 使用教程】

Fail2ban 使用教程 1. 安装 Fail2ban2. 配置 Fail2ban2.1 创建 jail.local 文件2.2 基本配置参数说明2.3 配置具体服务的监控规则2.3.1 SSH 服务2.3.2 Apache 服务 3. 启动和管理 Fail2ban3.1 启动 Fail2ban 服务3.2 设置 Fail2ban 开机自启3.3 检查 Fail2ban 服务状态3.4 重新…...

AI+视频监控电力巡检:EasyCVR视频中台方案如何赋能电力行业智能化转型

随着电力行业的快速发展&#xff0c;电力设施的安全性、稳定性和运维效率变得至关重要。传统视频监控系统在实时性、智能化及多系统协同等方面面临严峻挑战。EasyCVR视频中台解决方案作为一种先进的技术手段&#xff0c;在电力行业中得到了广泛应用&#xff0c;为电力设施的监控…...

C++从入门到入土(七)——多态

目录 前言 多态的概念 多态的定义 虚函数的介绍 虚函数的重写/覆盖 析构函数的重写 override和final关键字 纯虚函数和抽象类 重写/重载/隐藏总结 多态的原理 小结 前言 C一共有三个特性&#xff0c;封装、继承和多态&#xff0c;在前面的文章中&#xff0c;我们分别…...

新闻网页信息抽取

1. 网页信息抽取 问题定义&#xff1a;对新闻网页&#xff08;输入为HTML&#xff09;提取结构化信息&#xff0c;包括标题、发布时间、作者、正文、图片等。 动机&#xff1a;由于网页&#xff08;大多数为HTML格式&#xff09;通常带有很多标签、样式、脚本等信息&#xff0…...

MySQL中有哪些索引

1&#xff0c;B-Tree索引&#xff1a;常见的索引类型 2&#xff0c;哈希索引&#xff1a;基于哈希表实现&#xff0c;只支持等值查询 &#xff0c;只有Memory存储引擎和NDB Cluster存储引擎显示支持哈希索引 3&#xff0c;全文索引&#xff1a;可在字符列上创建&#xff08;T…...

Docker 部署Spring boot + Vue(若依为例)

首先我们要在docker中安装好环境镜像 jdk. mysql. redis. nginx 镜像安装我们在上一篇文章中已说明&#xff0c;请大家自行查看。 下面我介绍部署步骤 部署后台jar 在你的工作目录下新建application 用来存放后台jar包 1.将打好的jar包上传 2.编写Dockerfile文件&#…...

PDF文件里到底有什么?

PDF 文档结构由多个组件组成&#xff0c;这些组件决定了文本、图像和其他元素的存储和显示方式。PDF 是一种二进制文件格式&#xff0c;这意味着您无法在文本编辑器中直接编辑 PDF 文件。添加或删除一个字符都可能导致整个文件损坏&#xff01; PDF 文件结构 理解 PDF 文档结…...

FANUC机器人几种常用的通讯网络及接口

FANUC机器人几种常用的通讯网络及接口 Devicenet 网络通讯接口&#xff0c;接口为5针线 (规定用的机架为 81-84&#xff09; PROFIBUS 网络通讯接口&#xff0c;针脚为2针&#xff08;规定用的机架为 67&#xff09; Intemet 网络通讯接口&#xff08;常用的网线接口&#xf…...

实用插件分享:@plugin-web-update-notification/vite 的使用指南

实用插件分享&#xff1a;plugin-web-update-notification/vite 的使用指南 在前端开发的过程中&#xff0c;及时告知用户网页有更新是提升用户体验的一个重要方面。plugin-web-update-notification/vite 就是一款能够轻松实现网页更新通知功能的插件&#xff0c;下面就来详细…...

k8s 修改节点驱逐阈值

编辑 /var/lib/kubelet/config.yaml 文件 kind: KubeletConfiguration evictionHard:nodefs.available: "5%" # 降低磁盘压力触发阈值imagefs.available: "10%" # 调整容器镜像存储触发阈值nodefs.inodesFree: "3%...