OkHttp 的证书设置

server/2025/3/16 5:38:07/

在 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()


http://www.ppmy.cn/server/175332.html

相关文章

vue里面使用什么组件和后端接口通讯

在 Vue 项目中与后端接口通信&#xff0c;通常有以下几种常用的方式和组件&#xff1a; ### 1. **使用 Axios 进行 HTTP 请求** Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;适用于浏览器和 Node.js 环境。它支持请求和响应拦截、自动转换 JSON 数据、取消请求等功能…

MySQL开发陷阱与最佳实践:第1章:MySQL开发基础概述-1.2 MySQL开发环境搭建

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 第1章&#xff1a;MySQL开发基础概述1.2 MySQL开发环境搭建1.2.1 MySQL环境搭建方式对比与选型1.2.2 Windows环境搭建步骤详解1.2.2.1 官方安装包部署&#xff08;以MySQL 8…

Halcon 和 opencv比有什么区别与优劣

Halcon 和 OpenCV 都是机器视觉领域的重要工具&#xff0c;但它们的设计目标、功能特点和适用场景有所不同。以下是两者的详细对比&#xff1a; 1. ​定位与目标用户 ​Halcon&#xff1a; ​定位&#xff1a;商业机器视觉软件&#xff0c;专注于工业应用。​目标用户&#xf…

通过Apache HTTP Server部署SVN

1、安装Apache HTTP Server yum install -y httpd # CentOS/RHEL 2、安装Subversion及相关模块 yum install -y subversion mod_dav_svn mod_authz_svn mod_dav_svn&#xff1a;Apache与SVN集成模块mod_authz_svn&#xff1a;权限管理模块 3、创建版本库 mkdir -p…

opencv-显示图片

安装软件 sudo apt install python3 //确保虚拟机只有python3 ln -sf /usr/bin/python3.6 /usr/bin/python sudo apt install python3-pip pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple pip install opencv-contrib-python -i https://pypi.tuna…

C# 使用Markdown2Pdf把md文件转换为pdf文件

NuGet安装Markdown2Pdf库&#xff0c;可以把格式简单markdown文件转换为pdf。但该库用了Puppeteer Sharp&#xff0c;因此会在运行过程中提示指定Chrome浏览器路径或自动下载Chrome浏览器。 代码如下&#xff1a; using Markdown2Pdf;var converter new Markdown2PdfConverte…

pytorch中的基础数据集

数据是深度学习核心之一pytorch基础数据集介绍加载/读取/显示/使用代码演示与解释 常见的数据集Pascal VOC/COCO DataLoader DataLoader( dataset, 含义&#xff1a;指定要加载的数据集&#xff0c;它必须是 torch.utils.data.Dataset 类的子类实例。Dataset 类定义了如何获…

PyTorch多机训练Loss不一致问题排查指南:基于算子级一致性验证

比较二次训练过程中所有算子的误差,定位存在一致性问题的pytorch算子 一.背景二.技术方案1.核心思路2.关键技术点 三.代码 一.背景 在分布式训练场景中&#xff0c;观察到以下现象&#xff1a; 相同超参配置下&#xff0c;多次训练的Loss曲线存在显著差异&#xff08;波动幅度…