PulseHttps:零侵入的被动HTTPS抓包Web工具
文章目录一、项目简介解决什么问题二、技术栈三、核心功能1. 一键启动实时会话流2. HTTP/1.1增量解析 自动配对3. HTTP/2完整还原不是只能看 hex4. 响应体自动解压5. 服务端视角同样可抓6. 安全与自动化四、项目结构五、环境与依赖六、安装教程1. 安装 eCapture2. 构建 PulseHttps3. 运行4. systemd 常驻可选七、使用教程界面操作关键配置项REST API自动化场景运行效果八、已知限制九、写在最后在服务器上调试 HTTPS 请求传统方案要么改应用走代理要么部署 CA 证书做中间人。PulseHttps 换了一条路用 eBPF uprobe 直接 hook OpenSSL 的SSL_read/SSL_write在加密发生之前就把明文拿到手。无需证书、无需代理、无需修改任何应用浏览器里就能看到 Fiddler 风格的会话列表。以下文档和实现代码均使用Claude Code 火山引擎的GLM-5.3 编写。一、项目简介解决什么问题做后端开发/运维的同学对下面这些场景应该不陌生一台 Linux 服务器上跑着某个第三方程序甚至是个黑盒二进制它持续调用外部 HTTPS 接口你想知道它到底发了什么、对方回了什么——但你改不了它的代码甚至改不了它的配置nginx 作为服务端接收大量 HTTPS 入站请求想现场确认客户端到底发上来什么总不能抓个 pcap 回来慢慢解密生产/内网环境没有桌面装不了 Fiddler/Charles就算装了代理型工具要求应用把流量交给你容器里的进程可未必听你的。这类问题的共同痛点是代理方案要求应用配合中间人方案要求信任你的证书而在服务器场景里这两条路经常都走不通。PulseHttps 就是为这个场景做的一个类似 Fiddler 的 HTTPS 抓包Web工具跑在 Linux 服务器上通过集成 eCapture基于 eBPF/uprobe直接 hook OpenSSL 等 TLS 库以非代理方式获取本机所有 HTTPS 请求/响应明文然后在浏览器里实时查看┌──────────────── Linux 服务器root────────────────┐ │ │ │ 浏览器 ◄── HTTP/WS ──► PulseHttpsgin, :3000 │ │ ├─ REST /api/* /ws 推送 │ │ ├─ 会话存储内存环形缓冲 │ │ ├─ HTTP/1.1 流解析 配对 │ │ └─ ecapture 子进程管理 │ │ │ --ecaptureq │ │ ecapture tls官方二进制 │ │ │ eBPF uprobe │ │ libssl明文 hook 点 │ └─────────────────────────────────────────────────────┘原理一句话讲清HTTPS 的加密发生在 TLS 库内部应用调用SSL_write(明文)之后数据才被加密、SSL_read返回之前数据已被解密。eBPF uprobe 恰好能挂在这两个函数的出入口上所以拿到的天然就是明文——既不用伪装服务器不需要证书也不用截流量不需要代理。二、技术栈选型原则就一条够简单、可单文件部署。层技术说明抓包核心eCaptureeBPF/uprobe官方二进制作为子进程托管通过其ecaptureq协议WebSocket protobuf接收事件后端Go ginREST API 静态资源服务实时推送gorilla/websocket会话 100ms 合并推送同时是 ecaptureq 的 WS 客户端协议解析自研 golang.org/x/net/http2/hpackHTTP/1.1 增量解析器、HTTP/2 帧扫描器、HPACK 上下文管理前端Bootstrap 4.6 jQuery 3.5 highlight.js全部 CDN 引入原生 ES Modules无任何构建工具没有 webpack/vite/npm存储纯内存环形缓冲会话对象原地更新超限淘汰最旧不落盘部署go:embed前端静态资源内嵌进二进制单文件、任意目录运行一个值得说的取舍前端刻意保持零构建。抓包工具的受众是运维/SREclone 下来go build一下就能用不希望引入 node_modules 的心智负担。三、核心功能1. 一键启动实时会话流页面上点「启动抓包」工具拉起ecapture tls --ecaptureq ws://127.0.0.1:随机端口/之后所有被捕获的 HTTPS 流量以会话Session形式实时滚动时间、进程PID、方法、Host、路径、状态码、大小、耗时一应俱全顶部支持关键字/方法/状态码/阶段过滤。点击行进入详情页概要/请求/响应/原始数据四个页签JSON/HTML 语法高亮、图片直接预览、二进制 hex 展示。2. HTTP/1.1增量解析 自动配对数据源是零散的SSL_read/SSL_write明文事件工具按PIDFD跟踪每条连接增量喂给 HTTP/1.1 解析器方向自动识别根据首字节特征判断 READ 方向是请求服务端进程如 nginx还是响应客户端进程如 curl完整支持 Content-Length / chunked / until-close 三种 body 定界1xx 临时响应、101 协议升级、截断流都有对应处理同一连接上的请求/响应按 FIFO 配对成会话连接空闲超时自动终结规避 fd 复用导致的串流。3. HTTP/2完整还原不是只能看 hex这是整个项目里投入最大的一块也是和简单抓包脚本拉开差距的地方每条 h2流还原为一条独立会话方法/Host/路径/状态码/请求响应体与 HTTP/1.1 会话同等展示HPACK 动态表按方向独立维护复用x/net/http2/hpack.Decoder支持 CONTINUATION 跨帧头块、trailers、服务端推送PUSH_PROMISE 生成独立会话、RST_STREAM/GOAWAY 终结标注双向失步时自动降级为原始数据会话保证任何流量都可见。实测 86KB 的页面响应多帧、含 HPACK 动态表可以零字节差异还原。4. 响应体自动解压gzip/deflate/brotli 全部自动解压展示超限截断但保留真实大小统计。5. 服务端视角同样可抓nginx 等服务端的入站请求也逃不过READ 方向是客户端请求、WRITE 方向是响应HTTP/1.1 与 HTTP/2 均支持。这是代理型工具只能看客户端出站流量做不到的。6. 安全与自动化简单 Token 认证Bearer/查询参数/Cookie因为页面展示的是明文含 cookie、鉴权头生产环境务必设置完整的 REST API/api/status、/api/capture/start|stop、/api/sessions等便于二次开发或接入监控。四、项目结构PulseHttps/ ├── main.go # 入口配置加载、组件装配、信号处理 ├── config/config.go # YAML 配置定义与默认值 ├── internal/ │ ├── pb/ # ecaptureq 的 protobuf 定义拷贝自 eCapture v2.5.2 │ ├── ecapture/ # ecapture 子进程管理 WS 客户端 事件文本解析 │ │ ├── manager.go # 托管模式拉起/重启进程或 attach_url 附加模式 │ │ ├── client.go # gorilla WS 客户端protobuf 解码、45s 读超时、退避重连 │ │ └── eventparse.go # 事件文本解析READ/WRITE、ConnDataEvent 四元组 │ ├── capture/ # 核心明文字节流 → 结构化会话 │ │ ├── assembler.go # 按 PIDFD 跟踪连接、配对、空闲终结、四元组补全 │ │ ├── http1.go # HTTP/1.1 增量解析器 │ │ ├── h2frame.go # HTTP/2 帧扫描器含失步判定与重同步 │ │ ├── h2hpack.go # HPACK 上下文每方向独立失败永久降级 │ │ ├── h2.go # H2 流状态机流 ID → 会话映射 │ │ └── decode.go # gzip/deflate/brotli 解压 │ ├── store/ # 内存环形缓冲 过滤查询 │ └── web/ # gin 路由、REST API、/ws 推送、Token 中间件 ├── web/ # 前端index.html 原生 ES Modules ├── cmd/mockecapture/ # ecaptureq 协议模拟器无 Linux 环境时本地联调 ├── configs/ # 配置示例含 mock 联调配置 └── bin/ # WSL 部署/验证脚本分层职责清晰ecapture负责拿到字节capture负责字节变会话store负责存与查web负责看。事件从 libssl 到浏览器全程不落盘。五、环境与依赖运行环境Linux 服务器Linux内核 x86_64 ≥ 4.18 / arm64 ≥ 5.5eBPF uprobe 的硬性要求root 权限或CAP_BPFCAP_PERFMONcapability内核启用 BTFCONFIG_DEBUG_INFO_BTFy检查/sys/kernel/btf/vmlinux是否存在主流发行版默认开启被监控进程使用 OpenSSL/BoringSSL 系 TLS 库——nginx、curl、Python(requests)、Node 等都适用已安装 eCapture ≥ v2.5.0需支持--ecaptureq参数。构建环境Go ≥ 1.21 即可支持在 Windows/macOS 上交叉编译 Linux 二进制CGO_ENABLED0。两点提前说明避免踩坑Go 程序自身的 TLS 不经过 libsslGo 用自己的 crypto/tls抓不到——需要 eCapture 的 gotls 模块PulseHttps 暂未适配纯明文 HTTP 不在支持范围内本工具定位就是 HTTPS 监控。六、安装教程1. 安装 eCapture从 eCapture Releases 下载对应架构版本# 示例版本号以 releases 页面为准wgethttps://github.com/gojue/ecapture/releases/download/v2.5.2/ecapture-v2.5.2-linux-amd64.tar.gztar-xzfecapture-v2.5.2-linux-amd64.tar.gzsudomvecapture-v2.5.2-linux-amd64/ecapture /usr/local/bin/sudochmodx /usr/local/bin/ecapture验证sudo ecapture --help输出里能看到--ecaptureq参数即可。2. 构建 PulseHttps在 Linux 上gitclone仓库地址cdPulseHttpsCGO_ENABLED0go build-oPulseHttps.在 Windows 上交叉编译同样一行仓库附带的build.cmd双击即用CGO_ENABLED0GOOSlinuxGOARCHamd64 go build-obin/PulseHttps-linux-amd64.构建产物是单个静态二进制前端资源已内嵌scp 到任意 Linux 目录即可运行。3. 运行# 最简不写配置文件内置默认值监听 0.0.0.0:3000sudo./PulseHttps# 推荐复制示例配置至少设置 tokencpconfigs/config.yaml my.yamlvimy.yamlsudo./PulseHttps-cmy.yaml浏览器打开http://服务器IP:3000点击「启动抓包」——这时在服务器上随便curl https://www.example.com会话几秒内就会出现在列表里。务必设置 token页面展示的是 HTTPS 明文含 cookie、鉴权头等敏感信息token 留空等于把整台机器的流量明文挂在公网上。4. systemd 常驻可选# /etc/systemd/system/pulsehttps.service [Unit] DescriptionPulseHttps HTTPS monitor Afternetwork.target [Service] ExecStart/opt/pulsehttps/PulseHttps -c /opt/pulsehttps/config.yaml Restarton-failure # eBPF 需要 root如需降权可改用 CapabilityBoundingSetCAP_BPF CAP_PERFMON CAP_SYS_RESOURCE [Install] WantedBymulti-user.target七、使用教程界面操作启动抓包首页点击按钮即可。进阶参数可选仅抓指定 PID、指定 libssl.so 路径、每 CPU 缓冲大小、透传额外参数如--ssl_version openssl 3.0.2用于 OpenSSL 版本探测失败的场景。会话列表实时滚动支持关键字/方法/状态码/阶段过滤「丢弃」计数表示事件队列溢出高流量下可调大mapsize。详情查看四个页签——概要时间线/四元组、请求头体、响应自动解压后的 body、原始数据hex。关键配置项listen:0.0.0.0:3000# Web 监听地址token:your-secret# 访问令牌生产必设ecapture:bin:ecapture# ecapture 路径默认 PATH 查找pid:0# 仅抓指定进程0 全部libssl:# 指定 libssl 路径留空自动探测mapsize:1024# eBPF 每 CPU 缓冲 KB高流量调大auto_restart:false# ecapture 异常退出自动重启最多 3 次store:max_sessions:5000# 内存保留会话数环形淘汰max_body_bytes:2097152# 单 body 保留上限超出截断仍统计真实大小conn_idle_timeout:120s# 连接空闲超时REST API自动化场景方法路径说明GET/api/status运行状态与统计POST/api/capture/start启动抓包POST/api/capture/stop停止GET/api/sessions会话列表支持多维过滤GET/api/sessions/{id}会话详情含 bodyDELETE/api/sessions清空认证方式Authorization: Bearer tokenWebSocket/ws推送 session/status/log 三类消息用?token传参。运行效果八、已知限制限制说明单事件 ≤ 16KBeCapture 硬限制h2 走重同步恢复HTTP/1.1 表现为 body 截断h2 中途接入HPACK 是有状态压缩未从连接建立起抓取则头部不可解码响应体仍可还原会话有标注Go/Rust 静态 TLS不经过 libssl 的 TLS如 Go crypto/tls无法捕获高流量丢事件队列满丢弃并计数可调大mapsize仅 HTTPS明文 HTTP 不在范围内九、写在最后PulseHttps 本质上回答的是一个很具体的问题当你对一台 Linux 服务器上的 HTTPS 流量有看一眼的需求但既不能改应用、也不能装证书时还能怎么办eBPF 给了答案PulseHttps 把这个答案做成了顺手的产品形态——单文件部署、浏览器即用、Fiddler 式交互、HTTP/2 完整还原。项目完全开源抓包核心的功劳属于 eCaptureApache License 2.0PulseHttps 在其之上补齐了进程管理、协议重组、会话配对与 Web 交互这一整层。仓库地址https://gitee.com/penngo/ai_projects/tree/master/go/PulseHttps