【胖虎的逆向之路】Android自制Https证书实现双向认证
Android自制Https证书实现双向认证
- 1.基本概念
- 1.1 HTTP
- 1.2 HTTPS
- 1.3 加密方式
- 1.3.1 对称加密
- 1.3.2 非对称加密
- 1.4 SSL 功能
- 1.4.1 客户对服务器的身份认证
- 1.4.2 服务器对客户的身份认证
- 1.4.3 建立服务器与客户之间安全的数据通道
- 1.5 CA 证书
- 2.证书生成
- 2.1 生成根证书(CA)
- 2.2 生成服务器证书
- 2.3 生成客户端证书
- 3.集成方式
- 3.1 使用 OkHttp 进行 HTTPS 请求
- 3.2 使用原生请求进行 HTTPS 请求
- 4. 结束
1.基本概念
1.1 HTTP
Hyper Text Transfer Protocol ,超文本传输协议, 是互联网使用最广泛的一种协议,所有的WWW文件必须遵循的标准,Http协议传输的数据都是未加密的,也就是明文,因此使用Http传输敏感协议是不安全的。
1.2 HTTPS
Hyper Text Transfer Protocol over Secure Socket Layer,安全的超文本传输协议,其实就是Http外部套了一层TLS的壳,简单来讲:HTTPS 就是“安全版”的 HTTP, HTTPS = HTTP + SSL,Https 相当于在应用层和TCP层之间加入了一个SSL(或者TLS),SSL层对应用层收到的数据进行加密。
1.3 加密方式
1.3.1 对称加密
对称加密是指双方持有相同的密钥进行通信, 加密速度快,常见的对称加密算法有DES\3DES\AES等~
1.3.2 非对称加密
非对称加密,又称为公开密钥加密,是为了解决对阵加密中的安全问题而诞生,一个称为公开密钥(公钥 Public key),另一个成为私钥(Private key), 但是相对而言非非对称而言要慢于对称加密
1.公钥是对外开放的,私钥是自己拥有的;
2.公钥加密的数据,只能用私钥解密;
3.私钥加密的数据,只能用公钥解密;
TLS/SSL 中使用了RSA非对称加密,对称加密以及HASH算法,RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开,作为加密密钥;
SSL 协议既用到了对称加密也用到了非对称加密(公钥加密),在建立传输链路时,SSL 首先对对称加密的密钥使用公钥进行非对称加密,链路建立好之后,SSL 对传输内容使用对称加密。
对称加密 速度高,可加密内容较大,用来加密会话过程中的消息
公钥加密 加密速度较慢,但能提供更好的身份认证技术,用来加密对称加密的密钥
1.4 SSL 功能
1.4.1 客户对服务器的身份认证
SSL 服务器允许客户的浏览器使用标准的公钥加密技术和一些可靠的认证中心(CA)的证书,来确认服务器的合法性~
1.4.2 服务器对客户的身份认证
也可通过公钥技术和证书进行认证,也可通过用户名,password 来认证~
1.4.3 建立服务器与客户之间安全的数据通道
SSL 要求客户与服务器之间的所有发送的数据都被发送端加密、接收端解密,同时还检查数据的完整性。 SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持~
1.5 CA 证书
CA 证书是由 CA(Certification Authority)机构发布的数字证书。其内容包含:电子签证机关的信息、公钥用户信息、公钥、签名和有效期。这里的公钥服务端的公钥,这里的签名是指:用hash散列函数计算公开的明文信息的信息摘要,然后采用 CA 的私钥对信息摘要进行加密,加密完的密文就是签名。 即:证书 = 公钥 + 签名 +申请者和颁发者的信息。 客户端中因为在操作系统中就预置了 CA 的公钥,所以支持解密签名
2.证书生成
基本概念讲完之后,我们来实际操作一下证书的生成,博主这边主要使用到了open ssl~
2.1 生成根证书(CA)
首先,生成一个自签名的根证书作为根证书颁发机构(CA)
并生成根证书~
使用 OpenSSL 工具来生成:
openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -sha256 -days 365 -out ca.crt
tips:此步骤将要求提供一些信息(如国家、组织、通用名称等)。填写这些信息时要确保准确性,但在测试环境中可以使用虚拟的信息。
2.2 生成服务器证书
生成服务器证书并签署为受信任的证书
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csropenssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256
2.3 生成客户端证书
创建客户端密钥,生成证书签名请求(CSR)并签署客户端证书
openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csropenssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365 -sha256
需要注意的是:
保护密钥和证书: 密钥和证书必须得到妥善保护,确保只有授权的人能够访问
证书有效期: 在创建证书时,设置适当的有效期限,确保证书在过期之前能够持续有效
证书更新: 定期更新证书以确保安全性。在证书到期之前,应当重新生成并部署新的证书
3.集成方式
3.1 使用 OkHttp 进行 HTTPS 请求
- 将客户端证书和私钥文件放置到 Android 项目中
将客户端的证书文件(client.crt)和私钥文件(client.key)放置到 Android 项目的合适目录中(例如 res/raw 文件夹) - 集成对应okhttp 框架:
implementation 'com.squareup.okhttp3:okhttp:4.9.3' - 在 Android 代码中使用 OkHttp 进行请求
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;import java.io.InputStream;
import java.security.KeyStore;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;public class MyOkHttpClient {public static Response makeRequest() {try {// Load server certificateCertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");InputStream serverCertStream = getResources().openRawResource(R.raw.server);X509Certificate serverCertificate = (X509Certificate) certificateFactory.generateCertificate(serverCertStream);// Create KeyStore and TrustManagerKeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());keyStore.load(null, null);keyStore.setCertificateEntry("server", serverCertificate);TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());trustManagerFactory.init(keyStore);// Load client certificate and private keyKeyStore clientKeyStore = KeyStore.getInstance("PKCS12");InputStream clientCertStream = getResources().openRawResource(R.raw.client);clientKeyStore.load(clientCertStream, "client_password".toCharArray()); // Replace "client_password" with the password of your client keyKeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());keyManagerFactory.init(clientKeyStore, "client_password".toCharArray()); // Replace "client_password" with the password of your client key// Initialize SSLContext with TrustManager and KeyManagerSSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);// Set up OkHttpClient with SSL socket factoryOkHttpClient client = new OkHttpClient.Builder().sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustManagerFactory.getTrustManagers()[0]).build();// Make a request using OkHttpClientRequest request = new Request.Builder().url("https://your-server-url.com/api/endpoint").build();return client.newCall(request).execute();} catch (Exception e) {e.printStackTrace();}return null;}
}
这个示例代码假设您有服务器证书和客户端证书(包括私钥)的文件。需要替换以下部分:
R.raw.server: 服务器证书文件的资源 ID。确保将正确的服务器证书文件(通常为 server.crt)放置到 Android 项目中,并使用相应的资源 ID 替换。
R.raw.client: 客户端证书文件的资源 ID。确保将正确的客户端证书和私钥文件(通常为 client.p12 或 client.pfx)放置到 Android 项目中,并使用相应的资源 ID 替换。
“client_password”: 替换为您客户端证书的密码
当然,一些基础的例如网络权限等操作也是必备,在此不再赘述~
3.2 使用原生请求进行 HTTPS 请求
第一步同 3.1 ,在此不再赘述~ 以下是集成代码
try {KeyStore keyStore = KeyStore.getInstance("PKCS12");InputStream clientCertStream = getResources().openRawResource(R.raw.client);keyStore.load(clientCertStream, "password".toCharArray()); // Replace "password" with the password of your client keyKeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());keyManagerFactory.init(keyStore, "password".toCharArray());SSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(keyManagerFactory.getKeyManagers(), null, null);HttpClient httpClient = new DefaultHttpClient();SchemeRegistry schemeRegistry = new SchemeRegistry();schemeRegistry.register(new Scheme("https", new SSLSocketFactory(sslContext), 443));ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(httpClient.getParams(), schemeRegistry);httpClient = new DefaultHttpClient(cm, httpClient.getParams());HttpGet httpGet = new HttpGet("https://your-server-url.com/api/endpoint");HttpResponse response = httpClient.execute(httpGet);// 处理响应...} catch (Exception e) {e.printStackTrace();
}
4. 结束
此代码是一个基本示例,涉及的步骤包括加载证书、创建 KeyStore 和 TrustManager,并将其应用于 OkHttpClient和原生请求的 的 SSL 配置中,当然也请确保适当处理异常,并根据实际情况进行调整~
感谢, 如有任何问题,请随时评论or私信联系我~
相关文章:
【胖虎的逆向之路】Android自制Https证书实现双向认证
Android自制Https证书实现双向认证 1.基本概念1.1 HTTP1.2 HTTPS1.3 加密方式1.3.1 对称加密1.3.2 非对称加密 1.4 SSL 功能1.4.1 客户对服务器的身份认证1.4.2 服务器对客户的身份认证1.4.3 建立服务器与客户之间安全的数据通道 1.5 CA 证书 2.证书生成2.1 生成根证书…...
解析千兆多模光模块SFP-GE-SX
千兆多模光模块是一种基于光纤通信的光电转换模块,具有千兆(Gigabit)级别的传输速率。本文将对千兆多模光模块的定义、传输距离、参数、及其应用领域等进行详细介绍。 一、千兆多模光模块SFP-GE-SX是什么? 千兆多模光模块SFP-GE-S…...
Go语言基础简单了解
文章目录 前言关于Go学习流程 基础语法注释变量常量数据类型运算符fmt库 流程控制if、switch、selectfor、break、continue遍历String 函数值传递和引用传递deferinit匿名、回调、闭包函数 数组和切片Map结构体自定义数据类型接口协程和channel线程锁异常处理泛型文件读取文件写…...
kafka重平衡经验总结
文章目录 概要背景解决方法技术细节小结 概要 关于kafka重平衡问题在实践工作的应用 背景 重平衡包括以下几种场景: 消费者组内成员发生变更,这个变更包括了增加和减少消费者。注意这里的减少有很大的可能是被动的,就是某个消费者崩溃退出了主题的分…...
Py之jupyter_client:jupyter_client的简介、安装、使用方法之详细攻略
Py之jupyter_client:jupyter_client的简介、安装、使用方法之详细攻略 目录 jupyter_client的简介 jupyter_client的安装 jupyter_client的使用方法 1、基础用法 (1)、获取内核信息 (2)、执行代码块 (3)、远程执行代码 jupyter_client的简介 jupyter_client 包含 Jupyter 协…...
61.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏红字公告功能的逆向分析
内容来源于:易道云信息技术研究院VIP课 上一节内容:游戏公告功能的逆向分析与测试-CSDN博客 码云地址(master分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:63e04cc40f649d10ba2f4f…...
neo4j查询语言Cypher详解(五)--apoc
APOC (Awesome Procedures on Cypher)是一个Neo4j库,它提供了对其他过程和函数的访问,扩展了Cypher查询语言的使用。 apoc MATCH (n:Movie) CALL apoc.create.addLabels( n, [ n.genre ] ) YIELD node REMOVE node.genre RETURN node;附录 参考 apoc…...
odoo17 | 视图操作按钮
前言 到目前为止,我们主要通过声明字段和视图来构建我们的模块。在上一章中,我们刚刚通过计算字段和onchanges引入了业务逻辑。在任何真实的业务场景中,我们都会希望将一些业务逻辑链接到操作按钮。在我们的房地产示例中,我们希望…...
KBDPL.DLL文件丢失,软件游戏无法启动,修复方法
不少小伙伴,求助说遇到Windows弹窗提示“KBDPL.DLL文件丢失,应用无法启动的问题”,不知道应该怎么修复? 首先,先来了解“KBDPL.DLL文件”是什么? kbdpl.dll是Windows操作系统的一部分,是一个动…...
Webpack5 常用优化总结
本文主要总结经常用到的一些代码性能优化、减小代码体积、提升webpack打包构建速度等内容的方法。具体的实现可参考webpack官网查看相关示例。 注:如果读者还未接触过webpack,请先了解webpack的基本使用。 正文: SourceMap ---- 提升开发体…...
Oracle-视图与索引
视图 简介 视图是一种虚表 视图建立在已有表的基础上,视图赖以建立的的这些表成为基表 向视图提供的数据的内容的语句的select 语句,可以将视图理解为存储起来的select 语句 视图向用户提供基表数据的另外一种表现形式 视图的好处 控制数据访问 …...
在Linux写自己的第一个程序“hello Linux”
01.nano指令 我们在Windows中有很多的编译环境,大家应该都很熟悉,但是在Linux中,我们怎么写代码呢? 这里,我介绍一个非常简单的指令->nano 这个指令就类似于我们Windows中的记事本,使用方法也很简单 …...
【AI视野·今日Robot 机器人论文速览 第六十八期】Tue, 2 Jan 2024
AI视野今日CS.Robotics 机器人学论文速览 Tue, 2 Jan 2024 Totally 12 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Edge Computing based Human-Robot Cognitive Fusion: A Medical Case Study in the Autism Spectrum Disorder Therapy Author…...
图像识别快速实现
文本的跑通了,接下来玩玩图片场景 1. 引入模型 再另起类test_qdrant_img.py,转化图片用到的模型和文本不太一样,我们这里使用ResNet-50模型 import unittest from qdrant_client.http.models import Distance, VectorParams from qdrant_cl…...
一文详解动态 Schema
在数据库中,Schema 常有,而动态 Schema 不常有。 例如,SQL 数据库有预定义的 Schema,但这些 Schema 通常都不能修改,用户只有在创建时才能定义 Schema。Schema 的作用是告诉数据库使用者所希望的表结构,确保…...
Web网页开发-总结笔记2
28.为什么会出现浮动?浮动会带来哪些问题? 1)为什么会出现浮动: 为了页面排版时块元素同行显示 2)浮动带来的问题: 父元素高度崩塌29.清除浮动的方法 (额外标签法、父级overflow、after伪元素、双伪元素) (…...
C#的StringBuilder方法
一、StringBuilder方法 StringBuilder方法Append()向此实例追加指定对象的字符串表示形式。AppendFormat()向此实例追加通过处理复合格式字符串(包含零个或更多格式项)而返回的字符串。 每个格式项都由相应的对象自变量的字符串表示形式替换。AppendJoi…...
美格智能5G RedCap模组SRM813Q通过广东联通5G创新实验室测试认证
近日,美格智能5G RedCap轻量化模组SRM813Q正式通过广东联通5G创新实验室端到端的测试验收,获颁测评证书。美格智能已连续通过业内两家权威实验室的测试认证,充分验证SRM813Q系列模组已经具备了成熟的商用能力,将为智慧工业、安防监…...
MVCC 并发控制原理-源码解析(非常详细)
基础概念 并发事务带来的问题 1)脏读:一个事务读取到另一个事务更新但还未提交的数据,如果另一个事务出现回滚或者进一步更新,则会出现问题。 2)不可重复读:在一个事务中两次次读取同一个数据时,…...
通过国家网络风险管理方法提供安全的网络环境
印度尼西亚通过讨论网络安全法草案启动了其战略举措。不过,政府和议会尚未就该法案的多项内容达成一致。另一方面,制定战略性、全面的网络安全方法的紧迫性从未像今天这样重要。 其政府官方网站遭受了多起网络攻击,引发了人们对国家网络安全…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
