抓包工具(三)Wireshark代理抓包Java程序的HTTPS请求

目录

    • 一、需求背景
    • 二、操作步骤
      • 2.1 jSSLKeyLog 工具下载
      • 2.2 jSSLKeyLog工具使用
      • 2.3 将sslkeylog导入Wireshark
      • 2.4 测试Demo
      • 2.5 测试结果
        • 1)使用工具解密HTTPS前:
        • 2)实用工具解密HTTPS后:
    • 三、补充:如果出现未解密成功的情况

一、需求背景

在上一篇文章中,我们介绍了 Wireshark 抓包工具的基本使用:抓包工具(二)Wireshark 的下载、安装、使用、快捷键。

我们先回顾下:Wireshark 和其他抓包软件相比,优势在于直接在网络传输的物理层 进行抓包,对于本地开发调试程序发送的请求不需要代理也可以抓到。但是缺点就是 无法进行 HTTPS 请求包进行解密

我在网上找了很多篇文章,其实使用 Wireshark 进行 HTTPS 的 TLS流 进行解密 无非以下两种方式</:

  • 方法一:拿到服务器的 .p12 证书文件(含私钥信息),导入 Wireshark。

    这种方式除非是服务器的维护人员,否则一般情况下是拿不到的,而且拿出来之后的证书可以直接伪造网站信息,非常不安全。

  • 方法二:通过设置浏览器的启动参数,或者添加 SSLKEYLOGFILE 环境变量,记录到 HTTPS 加解密过程的日志文件,导入 Wireshark。

    这种方式一般仅适用于浏览器请求抓包。

今天,小编遇到了一个 JDK 小版本的请求问题,想抓包一下不同 JDK 版本的请求内容,以上两种方法都不适用,那怎么办呢?先看效果:

(注意:只有 TLS流HTTP流 是可以解密出来的,TCP流 则是无法解密的,不要追踪错了流类型。)

在这里插入图片描述

补充: 如果让 Java 程序走 Fiddler4 的代理也可以成功抓包,但是小编的情况比较特殊,走了 Fiddler4 的代理之后,问题就无法复现了。推测是 Fiddler4 对于请求内容进行了兼容调整,所以还得是 Wireshark 出马。


二、操作步骤

2.1 jSSLKeyLog 工具下载

我们都知道,一个完整的 HTTP 请求过程中会经历 三次握手四次挥手

上面我们介绍过的方法二其实就是通过收集 “三次握手” 过程中生成的 sslkeylog 密钥进行解密。这里我们同样也需要使用工具获取用来解密的密钥,如下所示:

  • jSSLKeyLog: https://github.com/jsslkeylog/jsslkeylog

官方介绍如下:

jSSLKeyLog 是一个 Java Agent 库,它可以将 Java 应用程序创建的 SSL 会话密钥记录到 Wireshark 可识别的日志文件中,从而可以通过 “跟踪 SSL 数据流” 功能调试 SSL 连接问题,就像连接未加密一样。它既适用于 Java 服务器软件,也适用于客户端软件。

(注意:jSSLKeyLog 工具要求环境在 JDK 7 及以上)

  • 官网下载: https://github.com/jsslkeylog/jsslkeylog/releases

如果是 JDK8 可以直接使用下面这个文件,小编亲测好用。

  • JDK8版本jSSLKeyLog下载: https://share.weiyun.com/h2i2oVns

文件如下所示:

在这里插入图片描述

2.2 jSSLKeyLog工具使用

使用时,我们只需要在启动命令加上如下参数即可:

-javaagent:D:\java\jSSLKeyLog.jar=D:\sslkeylog.txt

  • D:\java\jSSLKeyLog.jar:工具包位置。
  • D:\sslkeylog.txt:希望生成的SSL密钥文件位置。

如果是在 IDEA 中启动 Java 程序,可以在启动配置中先选择 Add VM options

在这里插入图片描述

然后添加启动参数,如下所示:

自动生成的 sslkeylog.txt 日志文件内容如下所示:

在这里插入图片描述

2.3 将sslkeylog导入Wireshark

打开 Wireshark,点击 编辑,再点击 首选项

Protocols 中选择 TLS 协议,再选择我们刚才生成的 sslkeylog.txt 文件,点击确定即可。

随后选择需要进行抓包的网卡,即可进行抓包。

2.4 测试Demo

这里我们以一个HTTPS测试网站 httpbin 为例进行请求,地址如下:

  • 页面地址: https://httpbin.org/#/Anything/post_anything
  • 接口地址: https://httpbin.org/anything

Wireshark筛选规则:

  • src or dst host httpbin.org

代码示例:

  • 启动参数:-javaagent:D:\java\jSSLKeyLog.jar=D:\sslkeylog.txt
package com.demo.example;import javax.net.ssl.*;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;/*** <p> @Title Test* <p> @Description Wireshark抓包工具Demo** @author ACGkaka* @date 2025/2/22 21:56*/
public class Test {public static void main(String[] args) {String url = "https://httpbin.org/anything";String param = "{\"appKey\":\"7844ed27528aa2e1b7a6a2878484ad4c\",\"userPhone\":\"155****8888\"}";System.out.println("===> 请求地址:" + url + ",请求内容:" + param);String result = doPostByJson(url, param);System.out.println("<== 响应结果:" + result);}/*** POST请求,JSON传参*/public static String doPostByJson(String urlPath, String json) {OutputStream outputStream = null;BufferedReader reader = null;try {// 信任所有Hosts(HTTPS专用)trustAllHosts();// 1、建立连接HttpURLConnection conn;URL url = new URL(urlPath);if (url.getProtocol().equalsIgnoreCase("https")) {HttpsURLConnection httpsConn = (HttpsURLConnection) url.openConnection();httpsConn.setHostnameVerifier(DO_NOT_VERIFY);conn = httpsConn;} else {conn = (HttpURLConnection) url.openConnection();}conn.setRequestMethod("POST");conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);conn.setRequestProperty("Connection", "Keep-Alive");conn.setRequestProperty("Charset", "UTF-8");conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");conn.setRequestProperty("accept", "application/json");// 2、写入请求体byte[] writebytes = json.getBytes();conn.setRequestProperty("Content-Length", String.valueOf(writebytes.length));outputStream = conn.getOutputStream();outputStream.write(json.getBytes());outputStream.flush();outputStream.close();// 3、读取响应InputStream inputStream = conn.getInputStream();reader = new BufferedReader(new InputStreamReader(inputStream));String line = reader.readLine();StringBuffer response = new StringBuffer();while (line != null) {response.append(line);line = reader.readLine();if (line != null) {response.append("\n");}}reader.close();return response.toString();} catch (Exception e) {e.printStackTrace();} finally {if (outputStream != null) {try {outputStream.close();} catch (IOException e) {System.out.println("输出流关闭失败");}}if (reader != null) {try {reader.close();} catch (IOException e) {System.out.println("输入流关闭失败");}}}return null;}// --------------------------------------------------------------------------------------------------------------// 私有方法// --------------------------------------------------------------------------------------------------------------/*** 信任所有Hosts(HTTPS专用)** (补充:如果服务器使用的SSL证书不是由Java默认信任的证书颁发机构(CA)签发的,例如自签名证书,就会报错:*      SunCertPathBuilderException: unable to find valid certification path to requested target。)*/private static void trustAllHosts() {TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[]{};}public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}}};try {SSLContext sc = SSLContext.getInstance("TLS");sc.init(null, trustAllCerts, new SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());} catch (Exception e) {e.printStackTrace();}}/*** HostnameVerifier 接口用于验证HTTPS连接的主机名是否与证书中的主机名匹配。** (补充:当Java应用程序尝试建立HTTPS连接时,它会检查服务器的SSL证书以确保其有效性,*      并且还会检查证书中的主机名是否与正在连接的实际主机名相匹配。如果主机名不匹配,*      默认情况下连接会被拒绝,从而保护应用程序不受潜在的安全威胁。)*/private final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {public boolean verify(String arg0, SSLSession arg1) {return true;}};
}

2.5 测试结果

1)使用工具解密HTTPS前:

如下图所示:

  1. 完全看不到HTTP流信息。
  2. Application Data 请求内容为密文乱码,无法查看。

在这里插入图片描述

在 Application Data 右键,点击 追踪流,选择 TLS Stream,看到的也是一团密文乱码,如下所示:

2)实用工具解密HTTPS后:

如下图所示,解析后的 HTTP流 显示出来了,而且内容为明文可见。

在这里插入图片描述

在 Application Data 右键,点击 追踪流,选择 TLS Stream,看到的也是清晰的明文,如下所示:


三、补充:如果出现未解密成功的情况

如下图所示,如果出现 [TCP Retransmission]TCP Previous segment not captured][TCP Out-Of-Order] 这种情况,我们只需要清掉已经抓包内容,重启 Wireshark 程序进行重新抓包即可恢复:

在这里插入图片描述

整理完毕,完结撒花~🌻





参考地址:

1.wireshark分析https之javaagent获取jsslkeylog进行解码,https://blog.csdn.net/zhaikaiyun/article/details/125366481

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[VSCode]彻底卸载和重装,并搭建Java开发环境

VSCode彻底卸载 由于当初是朋友帮忙装的&#xff0c;所以准备卸载,自己装一遍 从控制面板找到 vscode 将其卸载。 此时仅仅是删除了应用软件 删除安装插件 在图示路径中找到 .vscode 文件夹&#xff0c;将其删除&#xff0c;即可彻底清除安装的插件 C:\Users\user\.vscode …

泛微OA编写后端Rest接口

泛微OA编写后端Rest接口 前言 具体实现 运行结果 注意要点 总结 前言 在泛微E9中&#xff0c;可以通过注解的方式来编写对外的接口&#xff0c;之前的版本都是通过编写servlet类&#xff0c;然后在web.xml文件中将这个类和访问路径进行编辑之后才好在浏览器中通过输入对应…

041集——封装之:新建图层(CAD—C#二次开发入门)

如图所示&#xff1a;增加一个图层“新图层”&#xff0c;颜色为红&#xff08;1&#xff09;&#xff0c;当图层颜色定义为黄&#xff08;2&#xff09;时&#xff0c;直接覆盖之前图层颜色&#xff0c;图层名不变。 代码如下&#xff1a; /// </summary>/// <param …

Redis存储⑪主从复制_分布式系统解决单点问题

目录 1. 主从复制的概念 1.1 分布式解决单点问题 1.2 主从复制的特点 2. 模拟配置主从复制 2.1 建立复制 2.2 断开复制 2.3 安全性 2.4 只读 2.5 传输延迟 3. 主从复制的拓扑 3.1 一主一从结构 3.2 一主多从结构 3.3 树形主从结构 4. 主从复制的原理 4.1 复制过…

XiaoMi Mi5(gemini) 刷入Ubuntu Touch 16.04——安卓手机刷入Linux

最近在研究个人用的小服务器&#xff0c;期间也搞了一台某讯的盒子&#xff0c;s905的芯片&#xff0c;28G&#xff0c;刷入了Armbian&#xff0c;在自己本地当linux服务器用用挺方便的&#xff0c;但总感觉性能不太够。 然后灵机一动&#xff0c;手上还有几台旧的安卓手机&am…

SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】

文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表&#xff08;分页查询&#xff09; 2.1 前端Vue3 &#xff08;Vue3-Element-Admin&#xff09;2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 &#xff08;Vue3-Eleme…

HackTools插件+反弹shell的27种方法

前言 在渗透测试过程中&#xff0c;我们往往要使用很多命令&#xff0c;比如反弹shell、xss测试语句、sql测试语句、Linux常用提权语句、PowerShell常用语句。 为了方便&#xff0c;这里给大家推荐一个插件&#xff1a;HackTools&#xff0c;里面涵盖了渗透测试各种常用的语句…

Java语法-IO流

Java语法 Java基础语法 IO流 一、File类 /* java.io.File 文件类 提供了用于操作文件 创建文件 获取文件信息等 各种文件相关的方法 exists() 判断文件或目录是否存在 boolean isFile() 判断是否是文件 boolean isDirectory() 判断是否是目录 String getPath(…

Microsoft Office 2024 软件安装教程(免费)

1.通过百度网盘下载Microsoft Office 2024安装包 下载地址为: https://pan.baidu.com/s/1jk1kvQsKFH9dZGF5xfGgiQ?pwdjbkv 提取码: jbkv 。 2.安装环境 Win10~Win11或更高。 3.安装步骤 &#xff08;1&#xff09;下载压缩包&#xff0c;解压缩。 &#xff08;2&#xf…

鸿蒙NEXT应用App测试-专项测试(DevEco Testing)

注意&#xff1a;大家记得先学通用测试在学专项测试 鸿蒙NEXT应用App测试-通用测试-CSDN博客 注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注…

【学习笔记】【SpringCloud】MybatisPlus 基础使用

目录 一、使用 MybatisPlus 基本步骤 1. 引入 MybatisPlus 依赖 2. 定义Mapper接口并继承BaseMapper 二、MybatisPlus 常用配置 三、自定义SQL 四、IService 接口 1. 批量新增的效率问题 2. 配置方式 五、插件功能 1. 分页插件 一、使用 MybatisPlus 基本步骤 1. 引…

球队训练信息管理系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装球队训练信息管理系统软件来发挥其高效地信息处理的作用&a…

使用Dify将AI机器人嵌入到你的前端页面中及chrome的扩展应用

目录 1 博主有话说2 前提环境3 Dify创建个聊天助手应用4 将AI聊天机器人嵌入到html中5 将AI聊天机器人设置为chrome的扩展应用6 博主增语 1 博主有话说 那博主话不多说&#xff0c;先展示一下成果&#xff01; 这个界面是使用dify配置的一个“聊天助手”的应用&#xff0c;助…

Oracle JDK、Open JDK zulu下载地址

一、Oracle JDK https://www.oracle.com/java/technologies/downloads/ 刚进去是最新的版本&#xff0c;往下滑可以看到老版本 二、Open JDK的 Azul Zulu https://www.azul.com/downloads/ 直接可以选版本等选项卡

PiscTrace开发者版:只需考虑算法的视图处理应用

在计算机视觉领域&#xff0c;处理图像和视频数据的需求日益增长。无论是在智能监控、自动驾驶&#xff0c;还是工业检测中&#xff0c;图像处理都扮演着至关重要的角色。基于 OpenCV 的视图处理工具&#xff0c;专为需要高度定制和精确图像处理的开发者而设计。 一、CodeTrac…

线性回归 (Linear Regression)基础知识1

本章节主要介绍&#xff1a;回归任务简介、线性回归模型、回归任务的损失函数 *回归任务*机器学习的三要素线性回归线性回归模型 *数据分析*散点图*相关性系数矩阵 *拓展知识&#xff1a;相关性系数矩阵定义计算相关性系数矩阵示例应用 线性回归的损失函数回归任务目标函数&…

直角三角堰计算公式

直角三角堰的计算公式通常用于确定流经直角三角形形状的堰的流量。河北瑾航科技遥测终端机 通过采集液位数据(模拟量、串口485/232)&#xff0c;计算得到瞬时流量&#xff0c;然后通过积分进行累计算出累积量&#xff1b;直角三角堰的流量计算公式为&#xff1a; 直角三角堰 计…

《深度学习实战》第2集:卷积神经网络(CNN)与图像分类

《深度学习实战》第2集&#xff1a;卷积神经网络&#xff08;CNN&#xff09;与图像分类 引言 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是深度学习在计算机视觉领域的核心工具。从早期的 LeNet 到现代的 ResNet 和 Vision Transformer&#xf…

github 怎么创建一个私有repository 并从另外一台电脑拉取下来更新

1.github上新建一个repository 设置为private tips删除在这 点setting 然后往下拖动 会有个这里是用来删项目的 2.另外 一台电脑拉取这个repository的时候 需要配置 一个ssh key 这个key的内容生成参考本地电脑的生成 然后在这配置 2.1 生成 SSH 密钥&#xff08;如果还没有…

deepseek自动化代码生成

使用流程 效果第一步&#xff1a;注册生成各种大模型的API第二步&#xff1a;注册成功后生成API第三步&#xff1a;下载vscode在vscode中下载agent&#xff0c;这里推荐使用cline 第四步&#xff1a;安装完成后&#xff0c;设置模型信息第一步选择API provider&#xff1a; Ope…