【胖虎的逆向之路】Android自制Https证书实现双向认证

Android实现SSL Socket双向认证 1、生成服务端密钥 2、生成服务端证书 3、生成客户端密钥 4、生成客户端证书 5、将server端证书添加到serverTrust_ks.jks文件中 6、将client端证书添加到clientTrust_ks.jks文件中 (以上生成过程详见:https://blog.youkuaiyun.com/weixin_43192102/article/details/122214603) 7、将jks密钥转换为bks格式密钥(因为Android只支持.bks格式的密钥文件) ... 阅读详情

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.csr

openssl 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.csr

openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 365 -sha256

需要注意的是:
保护密钥和证书: 密钥和证书必须得到妥善保护,确保只有授权的人能够访问
证书有效期: 在创建证书时,设置适当的有效期限,确保证书在过期之前能够持续有效
证书更新: 定期更新证书以确保安全性。在证书到期之前,应当重新生成并部署新的证书

3.集成方式

3.1 使用 OkHttp 进行 HTTPS 请求

  1. 将客户端证书和私钥文件放置到 Android 项目中
    将客户端的证书文件(client.crt)和私钥文件(client.key)放置到 Android 项目的合适目录中(例如 res/raw 文件夹)
  2. 集成对应okhttp 框架:
    implementation 'com.squareup.okhttp3:okhttp:4.9.3'
  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 certificate
            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
            InputStream serverCertStream = getResources().openRawResource(R.raw.server);
            X509Certificate serverCertificate = (X509Certificate) certificateFactory.generateCertificate(serverCertStream);

            // Create KeyStore and TrustManager
            KeyStore 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 key
            KeyStore 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 key

            KeyManagerFactory 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 KeyManager
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

            // Set up OkHttpClient with SSL socket factory
            OkHttpClient client = new OkHttpClient.Builder()
                    .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustManagerFactory.getTrustManagers()[0])
                    .build();

            // Make a request using OkHttpClient
            Request 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 key

    KeyManagerFactory 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证书实现双向认证,【绝对干货 这里的公钥服务端的公钥,这里的签名是指:用hash散列函数计算公开的明文信息的信息摘要,然后采用 CA 的私钥对信息摘要进行加密,加密完的密文就是签名。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。填写这些信息时要确保准确性,但在测试环境中可以使用虚拟的信息。SSL 服务器允许客户的浏览器使用标准的公钥加密技术和一些可靠的认证中心(CA)的证书,来确认服务器的合法性~ 阅读详情

相关推荐

Android应用实现Https双向认证

为什么需要双向认证 Https保证的是信道的安全,即客户端和服务端通信报文的安全。但是无法保证中间人攻击,所以双向认证解决的问题就是防止中间人攻击。 中间人攻击(Man-in-the-MiddleAttack)简称(MITM),是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。若没有开启双向认证,中间人可以拦截客户端发送的请求,然后篡改信息再发送到服务端;中间人也可以拦截服务端返回的信息,再发送到客户端。所

renzhongrui的博客 4352

android Https的使用及双向验证证书

一、 Https 简介 1、 什么是Https? 简单来说, HTTPS = HTTP + SSL/TLS协议。 HTTP是应用层协议,TCP是传输层协议,在应用层和传输层之间,增加了一个安全套接层SSL/TLS 2. HTTPS加密方式(SSL/TLS 加密方式) SSL加密使用了对称加密及非对称加密的方式。在数据传输过程中,使用对称加密方式加密数据。使用非对称加密方式加密对称加密算法的密钥。 使用两种加密方式的原因:非对称加密拥有公,私两种密钥,加密及解密的算法不同,更安全,但在加密解密的

jiushi1995的博客 4862

2024年【胖虎的逆向之路】Android自制Https证书实现双向认证(1),跳槽面试大厂被拒怎么办

这里的公钥服务端的公钥,这里的签名是指:用hash散列函数计算公开的明文信息的信息摘要,然后采用 CA 的私钥对信息摘要进行加密,加密完的密文就是签名。确保将正确的客户端证书和私钥文件(通常为 client.p12 或 client.pfx)放置到 Android 项目中,并使用相应的资源 ID 替换。SSL 服务器允许客户的浏览器使用标准的公钥加密技术和一些可靠的认证中心(CA)的证书,来确认服务器的合法性~证书有效期: 在创建证书时,设置适当的有效期限,确保证书在过期之前能够持续有效。

2401_84520026的博客 1010

android HTTPS双向认证

近期项目中遇到需要对HTTPS进行双向认证,整理下可以实现的两种方式。

Froeverlove的博客 2412

Android逆向之https

TRACE | 追踪路径 | 1.1 || CONNECT | 将服务器作为代理,让服务器代替用户去访问 | 1.1 || LINK | 建立和资源之间的联系 | 1.0 || UNLINK | 断开连接关系 | 1.0 |

2401_89722475的博客 1670

HTTPS抓包实战:从原理到工具,破解证书锁定与双向认证

HTTPS作为HTTP的安全扩展,通过SSL/TLS协议在传输层与应用层之间建立加密通道,其核心安全机制依赖于数字证书和公钥基础设施。其工作原理基于非对称加密协商出对称会话密钥,确保数据传输的机密性与完整性。这项技术的价值在于为Web应用、API接口和移动App通信提供了基础的安全保障。在实际开发调试、安全审计和故障排查等应用场景中,工程师常需解析HTTPS流量以定位问题。本文聚焦于**HTTPS抓包**这一实践需求,深入剖析了通过中间人代理技术实现流量解密的核心方法论,并针对**证书锁定**等高级安全防护

weixin_30540691的博客 458

【胖虎的逆向之路】Android自制Https证书实现双向认证,2024年最新2024年网络安全开发者常见面试题

识点,真正体系化!**

2401_84247101的博客 744

安卓逆向实战:Frida绕过SSL Pinning与双向认证抓包技巧

本文详细介绍了使用Frida工具绕过安卓应用的SSL Pinning与双向认证的实战技巧。通过环境搭建、脚本编写和常见问题排查,帮助渗透测试人员有效突破安全机制,实现抓包分析。文章重点讲解了Frida在安卓逆向中的应用,包括SSL验证点定位和双向认证绕过方案。

weixin_42706667的博客 443

26.安卓逆向-抓包-常规的抓包验证-过双向证书检测

安卓逆向 安卓协议分析 app协议分析 保姆级攻略 app逆向 Android apk逆向

计算机王的博客 2322

HTTPS抓包实战指南:从原理到工具,破解证书绑定与双向认证

HTTPS协议通过TLS/SSL加密确保了网络通信的机密性与完整性,其核心原理基于非对称加密和数字证书体系。在开发、测试与安全领域,理解并掌握HTTPS流量分析技术具有重要价值,它不仅是调试接口、定位问题的关键手段,也是进行安全审计和漏洞挖掘的基础。通过中间人代理技术,抓包工具能够在客户端与服务器之间解密和查看加密流量,这一过程在合法授权下是工程实践的常见需求。然而,随着应用安全防护的加强,证书绑定和SSL Pinning等技术成为主要挑战,需要结合逆向工程或特定工具进行应对。本文聚焦于HTTPS抓包的核心

weixin_32234493的博客 285

Frida Hook动态修改SSLContext绕过Android双向证书认证

SSL/TLS证书认证是保障网络通信安全的基础机制,其中双向认证通过客户端与服务器相互验证证书,建立更高安全级别的加密通道。其原理基于SSLContext初始化时配置KeyManager和TrustManager,分别管理客户端证书和服务器证书验证。在移动安全测试与逆向工程领域,动态运行时分析技术如Frida插桩,能够在不修改应用源码的情况下,实时拦截和修改SSLContext的初始化参数,从而绕过客户端证书校验。这项技术对于安全研究人员分析加固应用、测试通信安全具有重要价值,尤其适用于金融、企业级App等

congji3817的博客 372

SSL双向认证绕过,HTTPS证书导出

​ 利用r0ysue大佬的r0Capture工具进行Hook抓包自动导出了App内的p12证书

qq_46723500的博客 3315

Android平台HTTPS抓包解决方案及问题分析

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。【Android思维脑图(技能树)】知识不体系?

2401_84009679的博客 1620

Android App抓包完全指南:从证书安装到双向认证

Android 抓包本质上是一场安全机制与调试需求的博弈。从用户证书到系统证书,从单向锁定到双向认证,防护手段在升级,绕过方法也在演进。没有万能方案,往往需要多种技术组合使用。

weixin_41943766的博客 765

Android抓包 - 证书认证

下图为HTTP协议的请求过程:传输过程中都是明文数据下图为HTTPS协议的请求过程:注意:公钥加密的数据只能通过对应的私钥才能解密,就算是进行加密的公钥也不能进行解密。加入charles后的流程如下:对于HTTP请求,charles不需要做什么配置,即可抓到包。对于HTTPS请求,charles如果不进行设置,抓到的包是经过了加密的。如果想进行解密,就需要得到对称密钥,而获得对称密钥的方法通过charles抓包是实现不了的。

dafan0的博客 1410

Halcon dyn_threshold详解

dyn_threshold 原型 dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : ) 功能 利用局部阈值分割图像 参数列表 OrigImage (input_object):原始图像 ThresholdImage (input_object):处理后图像(一般采用滤波处理) RegionDynThresh (output_object):分割后区域 Offset (input_control):灰

ZiLiangQin的博客 1万+

Android HTTPS双向认证实战:OkHttp+Retrofit+RxJava实现与安全配置

HTTPS作为保障网络通信安全的基础协议,通过SSL/TLS协议层实现数据加密与身份认证。其核心原理在于非对称加密与证书体系,服务器通过数字证书向客户端证明身份,建立加密信道。双向认证(mTLS)在此基础上进一步要求客户端也提供证书,实现双方身份互验,为金融交易、物联网设备管理等高安全场景提供通信保障。在Android开发中,OkHttp作为底层网络引擎,通过自定义SSLSocketFactory和X509TrustManager支持证书加载与验证逻辑;Retrofit负责API层封装,使安全配置透明化;R

weixin_33901926的博客 339

VTK四视图联动避坑指南:解决vtkImagePlaneWidget窗宽窗位同步与切片序号更新的那些坑

本文详细解析了VTK四视图联动开发中的关键技术点与常见问题,包括切片位置同步、窗宽窗位同步的实现原理及回调机制设计。针对开发中遇到的回调事件不触发、渲染性能低下等问题,提供了实用的解决方案和优化技巧,帮助开发者高效构建医学影像和科学可视化应用。

weixin_42638178的博客 391

ssl双向认证_APP爬虫双向认证抓包的两种方法

APP抓包相对繁琐,越来越多的 APP 在 https 请求和响应时,为了防止中间人攻击(或中间人抓包),会做证书认证,让抓包工具抓不到请求。证书认证分单向认证和双向认证,双向认证是相较于单向认证而言的,单向认证就是只在 APP 侧做证书校验,单向认证有现成的解决方法,比如用各种 bypass ssl 校验的 hook 脚本既可让单向认证失效,例如:JustTrustMe 。如果 APP...

weixin_39966740的博客 2724

QT+OSG/osgEarth编译之七十六:gltf+Qt编译(一套代码、一套框架,跨平台编译,版本:osgEarth-3.3插件库osgdb_gltf)

通过一套gltf代码和框架,实现osgdb_gltf跨平台编译。 在Qt环境下,集成头文件、库文件,构建跨平台编译的pro文件。 通过构建的一套配置工程,基于Qt Creator IDE,完成跨平台的编译实践。 在Windows、Linux、MacOS等操作系统上进行测试,成功编译,形成的成果(头文件、库文件等)可在不同系统下调用或使用,从而更好地构建跨平台解决方案。 采用的是osgEarth3.3版本。 读者可参考博客中的集成原理,构建不同版本的osgdb_gltf跨平台包。

LuckyHanMo的博客 1799

YOLO26涨点改进| CVPR 2026 | 独家创新首发、特征融合改进篇 | 引入 LFSB 差分双维注意融合模块,通过交替特征融合与分离策略,能够精准区分目标特征,顶会助力YOLO26有效涨点

本文提出LSFB差分双维注意融合模块,用于改进YOLO26目标检测模型。该模块通过融合-分离交替策略和差分注意力机制,有效提升模型在复杂场景下的特征分离能力,特别是在处理重叠物体或反射干扰时表现优异。LSFB采用双向投影、双维注意力计算和跨流减法算子,实现特征共享与独立提取的平衡。实验表明,该模块能显著减少特征混淆,提高检测精度和鲁棒性。文章还详细介绍了模块实现的核心代码、YAML配置文件修改方法以及三种改进方案,为YOLO26模型性能提升提供了创新解决方案。

Ai缝合怪、助力小伙伴高效发论文 326

Android 7.0以上版本 HTTPS 抓包解决方法

HTTP 协议发展至今,已经有二十多年的历史,整个发展的趋势主要是两个方向:效率 & 安全。 效率方面,从 HTTP1.0 的一次请求一个连接,到 HTTP1.1 的连接复用,到 SPDY/HTTP2 的多路复用,到 QUIC/HTTP3 的基于 UDP 传输,在效率方面越来越高效。 安全方面,从 HTTP 的明文,到 HTTP2 强制使用 TLSv1.2,到 QUIC/HTTP3 强制使用 TLSv1.3,越来越注重数据传输的安全性。 总而言之,HTTP 协议的发展对,用户是友好的,但是对开

农村打工仔的博客 9810

【小白CV教程】YOLOv5+Deepsort实现车辆行人的检测、追踪和计数

【小白CV教程】YOLOv5+Deepsort实现车辆行人的检测、追踪和计数本文禁止转载!项目简介:YOLOv5检测器:DeepSort追踪器:运行demo:训练自己的模型:调用接口:创建检测器:调用检测接口: 本文禁止转载! 项目简介: 使用YOLOv5+Deepsort实现车辆行人追踪和计数,代码封装成一个Detector类,更容易嵌入到自己的项目中。 代码地址(欢迎star): https://github.com/Sharpiless/Yolov5-deepsort-inference 最终效果:

梁瑛平的博客 5万+
上一篇: 【胖虎的逆向之路】——GOT/PLT Hook详解&针对自定义so库的Hook实操
下一篇: JavaScript学习之旅——初识
@王永超
博客等级 码龄10年 186粉丝 88原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值