Java 使用pcap4J解密HTTPS数据包

Java 使用pcap4J解密HTTPS数据包,java,ssl,https,fiddler,pcap4j,Java,Ssl,Https,Fiddler,Pcap4j,在Java中,我使用它捕获在我的计算机上运行的另一个应用程序的网络流量。我使用的代码如下所示: import org.pcap4j.core.*; import org.pcap4j.packet.Packet; import org.pcap4j.util.NifSelector; import java.io.IOException; import static org.pcap4j.core.BpfProgram.BpfCompileMode.OPTIMIZE; import stat

Java
中,我使用它捕获在我的计算机上运行的另一个应用程序的网络流量。我使用的代码如下所示:

import org.pcap4j.core.*;
import org.pcap4j.packet.Packet;
import org.pcap4j.util.NifSelector;

import java.io.IOException;

import static org.pcap4j.core.BpfProgram.BpfCompileMode.OPTIMIZE;
import static org.pcap4j.core.PcapNetworkInterface.PromiscuousMode.PROMISCUOUS;

public class Pcap4jLoop
{
    public static void main(String[] arguments) throws Exception
    {
        PcapNetworkInterface networkDevice = getNetworkDevice();

        try (PcapHandle handle = networkDevice.openLive(65536, PROMISCUOUS, 50))
        {
            String serverIP = "..."; // Filter for packets with just one server
            String bpfExpression = "dst host " + serverIP + " || src host " + serverIP;
            handle.setFilter(bpfExpression, OPTIMIZE);

            PacketListener listener = packet -> printPacket(packet, handle);

            handle.loop(Integer.MAX_VALUE, listener);

            //noinspection InfiniteLoopStatement,StatementWithEmptyBody
            while (true)
            {

            }
        }
    }

    private static PcapNetworkInterface getNetworkDevice() throws IOException
    {
        NifSelector nifSelector = new NifSelector();
        PcapNetworkInterface nif = nifSelector.selectNetworkInterface();
        if (nif == null)
        {
            System.exit(1);
        }
        return nif;
    }

    private static void printPacket(Packet packet, PcapHandle pcapHandle)
    {
        StringBuilder sb = new StringBuilder();
        sb.append("A packet captured at ")
                .append(pcapHandle.getTimestampPrecision())
                .append(":");
        System.out.println(sb);
        System.out.println(packet);
    }
}

不幸的是,流量是加密的,因此无法分析。然而,另一个名为的应用程序能够在没有任何特殊配置或服务器私钥的情况下对流量进行解密。Fiddler可以显示我感兴趣的正在交换的
JSON
结构。如何在
Java
code中执行相同的操作,以便使用捕获的
JSON
对象?(这个问题是关于解密部分,而不是之后的解析)

正如对这个问题的评论:


根据定义,您不能解密任何
TLS
流量(因此包括
HTTPS
)如果您无法控制任何一方或无法控制任何一方 一方给你协商的主密钥和客户端随机使用。只是想解密 任何随机
TLS
流量都不可能<代码>小提琴手通过 中间人,不通过解密直接发送的流量 另外两台电脑。当
Fiddler
不需要特殊配置时,客户端 需要特殊配置,即需要信任证书
Fiddler
用于动态创建证书的权限


Fiddler的做法是作为中间人,而不是解密其他两台计算机之间直接发送的流量。此外,虽然Fiddler不需要特殊配置,但客户端需要特殊配置,也就是说,它需要信任fiddler使用的证书颁发机构来动态创建证书。根据定义,如果您不控制任何一方,或者可以让任何一方给您协商的主密钥和使用的客户端随机密钥,则您无法解密任何TLS通信(包括HTTPS)。关于如何做到这一点,有很多教程。但仅仅尝试解密任何随机TLS流量是不可能的。