You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java测试场景下有没有类似Wireshark的抓包实现方案?

实现TLS版本回退校验的Java侧可行方案

方案1:原生抓包实现(匹配你预期的执行流程)

用当前仍在维护的Pcap4J库实现Java层直接抓包,无需调用外部tshark进程,完全符合你设想的启动抓包→发请求→停止抓包→解析报文的流程:
首先需要先在测试环境安装libpcap(Linux/macOS)或WinPcap/Npcap(Windows)底层依赖,这是所有抓包工具通用的底层组件。
引入Maven依赖:

<dependency>
    <groupId>org.pcap4j</groupId>
    <artifactId>pcap4j-core</artifactId>
    <version>1.7.5</version>
</dependency>
<dependency>
    <groupId>org.pcap4j</groupId>
    <artifactId>pcap4j-packetfactory-static</artifactId>
    <version>1.7.5</version>
</dependency>

示例代码逻辑如下:

// 初始化抓包器,指定网卡、过滤规则(只抓目标服务IP的443端口流量)
PcapHandle handle = Pcaps.openOffline(网卡名, 65536, PcapHandle.PromiscuousMode.PROMISCUOUS, 10);
handle.setFilter("tcp port 443 and host 你的目标服务IP", BpfHandle.BpfCompileMode.OPTIMIZE);

List<TlsPacket> tlsPackets = new ArrayList<>();
// 启动抓包线程
Thread sniffThread = new Thread(() -> {
    while (!Thread.interrupted()) {
        Packet packet = handle.getNextPacket();
        if (packet.contains(TlsPacket.class)) {
            tlsPackets.add(packet.get(TlsPacket.class));
        }
    }
});
sniffThread.start();

// 执行你的TLS请求逻辑
test.postToSomeTls12Service();

// 停止抓包
sniffThread.interrupt();
handle.close();

// 校验TLS版本:遍历握手包的Server Hello字段,确认协商版本为TLS 1.2
boolean useTls12 = tlsPackets.stream()
    .filter(p -> p.getHeader().getContentType() == TlsContentType.HANDSHAKE)
    .flatMap(p -> p.getHandshakePackets().stream())
    .filter(hp -> hp.getHeader().getType() == TlsHandshakeType.SERVER_HELLO)
    .map(hp -> (TlsServerHello) hp)
    .anyMatch(sh -> sh.getHeader().getVersion().equals(TlsVersion.TLS_1_2));

// 断言校验结果
Assert.assertTrue(useTls12);

方案2:轻量无抓包方案(更简洁,无需网卡权限)

如果你的测试不需要强制校验网络层报文,直接在客户端侧获取协商完成的TLS会话版本即可,实现成本极低,不需要任何额外依赖和环境配置:
示例代码(以OkHttp客户端为例):

OkHttpClient client = new OkHttpClient.Builder()
    .addNetworkInterceptor(chain -> {
        Response response = chain.proceed(chain.request());
        // 直接拿到协商后的TLS版本
        String tlsVersion = response.handshake().tlsVersion().javaName();
        // 直接在此处断言版本为TLSv1.2即可
        Assert.assertEquals("TLSv1.2", tlsVersion);
        return response;
    })
    .build();

// 执行请求即可自动完成校验
Request request = new Request.Builder().url("你的TLS1.2服务地址").build();
client.newCall(request).execute();

如果用原生HttpsURLConnection,直接调用getSSLSession().getProtocol()即可拿到协商的TLS版本。

方案选择建议

  • 若测试要求必须验证网络传输层面的真实握手报文,选择方案1
  • 若仅需验证客户端最终协商的TLS版本是否符合预期,优先选择方案2,实现简单、执行快、无额外环境依赖

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 07:15:00