docker与gosu,Golang平台HTTPS抓包解决方案及问题分析
    		       		warning:
    		            这篇文章距离上次修改已过451天,其中的内容可能已经有所变动。
    		        
        		                
                
package main
 
import (
    "crypto/tls"
    "flag"
    "log"
    "net/http"
    "os"
 
    "github.com/google/gopacket"
    "github.com/google/gopacket/pcap"
    "github.com/google/gopacket/tcpassembly"
)
 
// 定义HTTPS流的处理方法
func handleHTTPSFlow(net, transport gopacket.Flow, ac *tcpassembly.Assembler) {
    // 为指定的流创建一个stream factory
    streamFactory := tcpassembly.NewStreamPool(tcpassembly.StreamPoolOptions{
        ReassemblyTimeout: 10 * time.Minute, // 重组超时时间
    })
    // 将流工厂绑定到传输层和指定的处理方法
    streamFactory.SetPassiveStreamFactory(
        &passiveStreamFactory{
            net:         net,
            transport:   transport,
            handleHTTPS: handleHTTPS,
        },
        ac,
    )
}
 
// 定义处理HTTPS流的方法
func handleHTTPS(net, transport gopacket.Flow, buf []byte, tc *tcpassembly.TCPAssembler) {
    // 通过TLS dial来创建一个tls.Conn
    tlsConn, err := tlsDial(net, transport)
    if err != nil {
        log.Println("tlsDial error:", err)
        return
    }
    defer tlsConn.Close()
 
    // 使用tls.Conn来读取和处理数据
    ...
}
 
// 定义TLS握手的DIAL方法
func tlsDial(net, transport gopacket.Flow) (*tls.Conn, error) {
    // 创建一个net.Conn,从流中重建TCP连接
    conn, err := reassembleTCP(net, transport)
    if err != nil {
        return nil, err
    }
    defer conn.Close()
 
    // 使用tls包进行握手
    tlsConn := tls.Client(conn, &tls.Config{
        InsecureSkipVerify: true, // 跳过证书验证
    })
    err = tlsConn.Handshake()
    if err != nil {
        return nil, err
    }
 
    return tlsConn, nil
}
 
// 主函数
func main() {
    // 解析命令行参数
    iface := flag.String("i", "eth0", "interface to use")
    snaplen := flag.Int("s", 100, "snapshot length")
    flag.Parse()
 
    // 从指定接口捕获数据包
    handle, err := pcap.OpenLive(*iface, int32(*snaplen), true, pcap.BlockForever)
    if err != nil {
        log.Fatal(err)
    }
    defer handle.Close()
 
    // 创建一个assembler
    assembler := tcpassembly.NewAssembler(tcpassembly.AssemblerOptions{
        // 注册处理TCP流的方法
        LayerType:     layers.LayerTypeTCP,
        TrackingType:  tcpassembly.TrackingTypeFields,
        IgnoreTS:      true,
        HandleMissing: true,
    })
 
    // 为TCP端口443注册流处理方法
    assembler.RegisterForPort(layers.TCPPort(443), handleHTTPSFlow)
 
    // 开始捕获并处理数据包
    packetSource := gopacket.NewPacketSource(handle, handle.LinkType())
    for packet := range packetSource.Packets() {
        assembler.Assemble(packet)
    }
}这个代码示例展示了如何使用
评论已关闭