ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

curl-impersonate 构建与安装全指南:从源码编译、交叉编译到 Docker 镜像

curl-impersonate 构建与安装全指南:从源码编译、交叉编译到 Docker 镜像 网络安全网络开发工具【免费下载链接】curl-impersonatecurl-impersonate: A special build of curl that can impersonate Chrome Firefox项目地址https://gitcode.com/gh_mirrors/cu/curl-impersonate点击查看免费下载本文是 curl-impersonate 的官方安装文档INSTALL.md的深度实战版。curl-impersonate 是一套对 curl 进行深度改造的特殊构建产物能够让 TLS 与 HTTP/2 握手与真实浏览器Chrome、Edge、Safari、Firefox完全一致。本文系统讲解其三种构建路径——autotools 原生构建Ubuntu / Red Hat 系 / macOS、aarch64 交叉编译以及Docker 容器构建并深入到 Makefile.in、configure.ac、Dockerfile 等源码层说明每个依赖NSS、BoringSSL、nghttp2、brotli、每个 configure 参数的真实作用与底层传递链路。读完本文你将能够在自己的机器上从零编译出两个版本chrome 版 / firefox 版的 curl-impersonate并把它们安装到自定义路径或直接产出一套可移植的 Docker 镜像。一、版本与构建选项总览INSTALL.md 开篇即点明了本项目的构建哲学构建过程会自动完成下载依赖 → 打补丁 → 编译依赖 → 编译打过补丁的 curl这一整条流水线用户无需手动逐个子项目去配置。当前仓库一共提供三种构建方式按使用场景区分构建方式适用场景依据文件Native build原生构建在 Ubuntu / CentOS / Fedora / Amazon Linux / macOS 本机直接编译安装Makefile.in configure.acCross compiling交叉编译从 x86-64 主机为 ARM64aarch64等目标架构构建Makefile.inNSS 交叉编译分支Docker build容器构建可复现构建也是项目官方 CI 使用的参考实现chrome/Dockerfile、firefox/Dockerfile两个版本chrome 版与 firefox 版由于技术原因curl-impersonate存在两个二进制版本这一点在 INSTALL.md 中被反复强调chrome 版用于伪装 Chrome、Edge 与 Safari。它基于 BoringSSLGoogle 的 TLS 库编译相关构建入口集中在 chrome/ 目录。firefox 版用于伪装 Firefox。它基于 NSSMozilla 的 TLS 库即 Firefox 使用的库编译相关构建入口集中在 firefox/ 目录。这一区分的根源在于两个浏览器家族使用完全不同的 TLS 库与扩展行为从 README.md 的 How? 一节可以看到正是用 NSS/BoringSSL 替换 OpenSSL、修改 TLS 扩展与 SSL 选项配置、增加新 TLS 扩展、改写 HTTP/2 设置、配合--ciphers/--curves/-H等非默认 flags这五类改动才让最终产物的网络侧观感与真实浏览器无异。二、Native BuildUbuntu 从零构建2.1 安装构建依赖sudo apt install build-essential pkg-config cmake ninja-build curl autoconf automake libtool # For the Firefox version only sudo apt install python3-pip libnss3 pip install gyp-next export PATH$PATH:~/.local/bin # Add gyp to PATH # For the Chrome version only sudo apt install golang-go unzip这些依赖的用途可以在 Makefile.in 的构建规则中找到一一对应cmakeninjaBoringSSL 采用 CMake Ninja 构建见 Makefile.in 中cmake ... -GNinja ..与ninja。configure 脚本会依次探测cmake3/cmake与ninja/ninja-build两种命名见 configure.ac。autoconf automake libtoolcurl 与 nghttp2 被打补丁后需要重新生成 configure 脚本autoreconf -fi见 Makefile.in 与 Makefile.in。golang-goBoringSSL 的构建依赖 Go其构建系统使用 Go 生成代码。unzip解压 BoringSSL 的 zip 源码包Makefile.in。python3-pipgyp-nextNSS 使用 gyp 构建系统生成项目文件firefox 版必须安装。libnss3为 firefox 版运行时提供libnssckbi.so内含 Mozilla 根证书库详见后文Firefox 版本注意事项。2.2 克隆、配置与编译安装git clone https://github.com/lwthiker/curl-impersonate.git cd curl-impersonate mkdir build cd build ../configure # Build and install the Firefox version make firefox-build sudo make firefox-install # Build and install the Chrome version make chrome-build sudo make chrome-install # You may need to update the linkers cache to find libcurl-impersonate sudo ldconfig # Optionally remove all the build files cd ../ rm -Rf build值得注意的几点建议在独立的build/目录中运行../configure这样源码目录保持干净便于之后清理。make firefox-build与make chrome-build是两个完全独立的构建目标它们的产物同名但互斥curl 源码目录中的.firefox与.chrome标记文件会互相清除见 Makefile.in 与 Makefile.in因此同一份源码可以先后构建出两个版本。make firefox-install会把firefox/curl_ff*系列包装脚本装进bindirmake chrome-install则安装chrome/curl_chrome*、chrome/curl_edge*、chrome/curl_safari*三套脚本见 Makefile.in 与 Makefile.in。安装完成后运行sudo ldconfig确保动态链接器能找到libcurl-impersonate。2.3 安装路径与验证默认安装前缀为/usr/local产物包括curl-impersonate二进制、libcurl-impersonate库以及全套包装脚本。如需自定义安装位置../configure --prefix/path/to/install/安装完成后可以用两种方式运行# 方式一包装脚本推荐自动带上全部伪装参数 curl_ff98 https://www.wikipedia.org curl_chrome99 https://www.wikipedia.org # 方式二直接调用二进制并自行控制参数 curl-impersonate-ff https://www.wikipedia.org curl-impersonate-chrome https://www.wikipedia.org注意方式二直接运行二进制时默认不会产生与浏览器一致的 TLS/HTTP2 签名因为伪装所需的--ciphers、-H等参数是由包装脚本附加的详见 docs/02_USAGE.md。包装脚本的真实内容可以参考 chrome/curl_chrome99 与 firefox/curl_ff98例如 chrome 版会追加--tlsv1.2 --alps --cert-compression brotli --http2 --compressed及一整套-H请求头。此外Makefile 还提供了构建自检目标可在安装前验证关键特性是否全部编译进二进制仅在本机非交叉编译时执行make chrome-checkbuild # 检查 zlib / brotli / nghttp2 / BoringSSL make firefox-checkbuild # 检查 zlib / brotli / nghttp2 / NSS其实现见 Makefile.in 与 Makefile.in本质上是对./src/curl-impersonate-ff -V与./src/curl-impersonate-chrome -V的输出做grep断言。在交叉编译时会跳过该检查并打印 Cross compiling, skipping checkbuild。三、Native BuildRed Hat 系CentOS / Fedora / Amazon LinuxRed Hat 系与 Ubuntu 的主要差异在于依赖安装命令与包名yum groupinstall Development Tools yum groupinstall C Development Tools and Libraries # Fedora only yum install cmake3 python3 python3-pip # Install Ninja. This may depend on your system. yum install ninja-build # OR pip3 install ninjafirefox 版额外依赖yum install nss nss-pem pip3 install gyp-nextchrome 版需要 Go若系统没有打包 golang请参考 Go 官方安装文档yum install golang依赖就绪后后续的mkdir build cd build ../configure make chrome-build等步骤与 Ubuntu 完全一致INSTALL.md 明确指引 Then follow the Ubuntu instructions for the actual build。这里补充一个从源码确认的细节configure.ac在探测构建工具时同时接受cmake3 cmake与ninja ninja-build两种候选名configure.ac这正是为兼容 Red Hat 系cmake3、ninja-build与 Debian 系cmake、ninja不同包命名而设计的。四、Native BuildmacOSmacOS 侧使用 Homebrew 安装依赖且由于 macOS 默认没有 GNU make编译安装命令需用gmakebrew install pkg-config make cmake ninja autoconf automake libtool # For the Firefox version only brew install sqlite nss pip3 install gyp-next # For the Chrome version only brew install go git clone https://github.com/lwthiker/curl-impersonate.git cd curl-impersonate mkdir build cd build ../configure # Build and install the Firefox version gmake firefox-build sudo gmake firefox-install # Build and install the Chrome version gmake chrome-build sudo gmake chrome-install # Optionally remove all the build files cd ../ rm -Rf buildmacOS 特有细节在 Makefile.in 中NSS 构建完成后会显式rm -Rf $(nss_install_dir)/lib/*.dylib删除动态库以强制链接器在链接 curl 时使用静态库——这是 macOS 上构建 firefox 版能成功的关键 hack。另外 Makefile 会将 autoconf 风格的系统名转换为 CMake 风格darwin*→Darwin见 Makefile.in保证 brotli 与 BoringSSL 的 CMake 构建在 macOS 上正常工作。五、静态编译与 curl 构建定制5.1 静态编译如果希望curl-impersonate与libcurl-impersonate静态链接产物可独立拷贝到其它机器运行../configure --enable-static该开关在 configure.ac 中定义默认值为no置为yes后Makefile.in 会向 curl 的 configure 追加--enable-static --disable-shared从而只产出静态二进制。5.2 定制 curl 自身构建底层 curl 的 configure 参数可以通过CURL_CONFIG_FLAGS环境变量透传../configure CURL_CONFIG_FLAGS--disable-rtsp该变量的传递链路非常清晰先在 configure.ac 中通过AC_ARG_VAR声明为可配置变量随后在 Makefile.in 中代入CURL_CONFIG_FLAGS最终拼接进 curl 的 configure 命令firefox 版见 Makefile.inchrome 版见 Makefile.in。除了用户传入的 flagsMakefile 还会自动追加firefox 版--with-nghttp2dir、--with-brotlidir、--with-nssdir --with-nss-deprecated、--enable-websockets、USE_CURL_SSLKEYLOGFILEtrue并用CFLAGS补充 NSS/nspr 头文件路径Makefile.in。chrome 版--with-nghttp2dir、--with-brotlidir、--with-opensslboringssl 构建目录、--enable-websockets、USE_CURL_SSLKEYLOGFILEtrue并追加LIBS-pthreadMakefile.in。其中USE_CURL_SSLKEYLOGFILEtrue是为了开启 SSLKEYLOGFILE 调试能力Dockerfile 注释也明确写着 Enable keylogfile for debugging of TLS traffic便于用 Wireshark 分析 TLS 流量。六、Firefox 版本注意事项NSS 与根证书firefox 版将 NSSFirefox 的 TLS 库静态编译进 curl但 NSS 要验证服务器证书还需要一份可信根证书列表。curl 在运行时动态加载 NSS 库中的libnssckbi内含 Mozilla 根证书库。如果缺少它会出现以下两类经典报错curl: (60) Peers Certificate issuer is not recognized或curl: (77) Problem with the SSL CA cert (path? access rights?)排查步骤确认 NSS 已按前文安装Ubuntusudo apt install libnss3Red Hatyum install nss nss-pemmacOSbrew install nss。若问题依旧可能是 NSS 被安装到了非标准路径例如/usr/lib之外此时可借助交叉编译章节的--with-libnssckbi参数显式指定libnssckbi.so的所在目录。这一机制在 firefox/Dockerfile 中也有明确注释curl 会尝试从/usr/lib/x86_64-linux-gnu/nss/libnssckbi.so加载证书该文件由 Debian/Ubuntu 的libnss3包提供最终镜像层又追加了nss-plugin-pemfirefox/Dockerfile。临时规避方案是curl -k关闭证书校验但这会破坏安全验证仅在调试时使用。七、Cross Compiling为 aarch64ARM64交叉编译INSTALL.md 明确指出仓库对交叉编译提供了基础支持目前主要用于从 x86-64 主机构建 aarch64 版本。交叉编译比原生构建更棘手有两个主要原因zlib 必须为目标架构单独编译否则链接失败一些路径必须手动指定因为 curl 自身的构建系统在交叉环境下无法自动探测。官方示例Ubuntu x86_64 → aarch64sudo apt-get install gcc-aarch64-linux-gnu g-aarch64-linux-gnu ./configure --hostaarch64-linux-gnu \ --with-zlib/path/to/compiled/zlib \ --with-ca-path/etc/ssl/certs \ --with-ca-bundle/etc/ssl/certs/ca-certificates.crt \ --with-libnssckbi/usr/lib/aarch64-linux-gnu/nss make chrome-build make firefox-build各参数含义--with-zlibPATH指向为目标架构编译好的 zlib 库所在目录。该参数在 configure.ac 中定义支持三种取值形态不传/传--with-zlib自动检测系统 zlib、传--with-zlibPATH使用指定路径、传--without-zlib不支持直接AC_MSG_ERROR报错。Makefile 会原样传递给 curl 的--with-zlibMakefile.in。--with-ca-pathDIRECTORY与--with-ca-bundleFILE原样传递给 curl 的 configure用于告诉 curl 在目标系统上到哪里找 CA 证书configure.ac。二者仅对 chrome 版生效对应 Makefile.in 中只有 chrome 配置块会拼接这两个参数firefox 版用 NSS 的证书库不走这条路径。--with-libnssckbiDIRECTORY指定目标系统上libnssckbi.so所在目录。只有当 NSS 未安装在标准位置如/usr/lib时才必须提供configure.ac。该参数会被 Makefile 传给 curl 的--with-libnssckbi一个为本项目新增的 configure 选项见 Makefile.in。交叉编译在 Makefile 层面的特殊处理还包括NSS 的构建脚本本身不支持交叉编译因此 Makefile 会先手动交叉编译 NSPRNSS 的底层依赖再以--with-nspr指向该产物去构建 NSSMakefile.in同时根据host_cpu是否 64 位自动决定use_64与--enable-64bit配置。nghttp2 与 curl 的 configure 都会继承--host$(host_alias)Makefile.in。八、Docker Build可复现的参考实现INSTALL.md 将 Docker 构建定位为更可复现、且作为参考实现。两个 Dockerfile 均由 Dockerfile.template 通过 generate_dockerfiles.sh基于 mustache 模板渲染生成包含 Debian 与 Alpine 两个变体。8.1 Chrome 版本镜像docker build -t curl-impersonate-chrome chrome/构建产物位于镜像的/usr/local目录curl-impersonate-chrome/curl-impersonate可伪装 Chrome/Edge/Safari 的 curl 二进制。静态链接libcurl、BoringSSL 与 libnghttp2避免与系统既有库冲突。官方说明标注其在 Ubuntu 20.04 上测试可用。既可在容器内直接使用也可docker cp拷出或作为多阶段构建multi-stage build的中间产物。curl_chrome99、curl_chrome100、…携带全部所需 flags 的包装脚本。libcurl-impersonate-chrome.so/libcurl-impersonate.so带伪装能力的 libcurl 动态库供库方式集成。8.2 Firefox 版本镜像docker build -t curl-impersonate-ff firefox/产物结构类似curl-impersonate-ff静态链接 libcurl、nss、libnghttp2curl_ff91esr、curl_ff95、… 包装脚本libcurl-impersonate-ff.so。特别提醒即使在容器外使用也建议安装libnss3——虽然 nss 已静态编译进二进制但 curl 仍会动态加载包含 Mozilla 根证书库的libnssckbi.sosudo apt install libnss3若不想安装可退而使用curl -k关闭证书校验不推荐用于生产。8.3 从 Dockerfile 看到的构建流水线阅读 chrome/Dockerfile 可以还原出一条完整的构建流水线这与 Makefile 的流程一一对应以python:3.11-slim-bookworm为构建阶段基础镜像Python 用于构建 libnss编译 brotli 1.0.9cmake -DCMAKE_BUILD_TYPERelease -DCMAKE_INSTALL_PREFIX./installed下载指定 commit 的 BoringSSL应用 chrome/patches/boringssl-old-ciphers.patch用 CMakeNinja 编译编译 nghttp2 1.56.0--with-pic --disable-shared仅生成静态库下载 curl-8.1.1应用 chrome/patches/curl-impersonate.patch及其它补丁如 chrome/patches/curl-CVE-2023-38545.patch再autoreconf -fi重新生成 configure先以--enable-static --disable-shared静态编译出curl-impersonate二进制并用grep -q系列断言校验 zlib/brotli/nghttp2/BoringSSL/wss 特性齐全、ldd确认无动态依赖chrome/Dockerfile再重新以动态方式编译出libcurl-impersonate-chrome.so及其符号链接同样校验多阶段构建收尾最终镜像debian:bookworm-slim只装入产物、CA 证书与包装脚本。firefox 版在步骤 1-3 处的差异是下载并静态构建 NSS 3.92含 nspr 4.35./build.sh -o --disable-tests --static --pythonpython3见 firefox/Dockerfile最终镜像额外安装libnss3 nss-plugin-pemfirefox/Dockerfile。此外Alpine 变体如 chrome/Dockerfile.alpine会用apk安装依赖并把包装脚本的 shebang 从/usr/bin/env bash改写为/usr/bin/env ash以适配 Alpine 的默认 shellchrome/Dockerfile.alpineDocker Hub 上发布的基于 Alpine 与 Debian 的官方镜像可以直接docker pull/docker run使用见 README.md。九、安装后的验证与配套测试构建安装完成并非终点。仓库在 tests/ 目录提供了签名一致性测试用于验证curl-impersonate的网络签名与目标浏览器一致而非测试 curl 本身的功能详见 tests/README.md# 先构建好两个 Docker 镜像再构建并运行测试镜像 docker build -t curl-impersonate-tests tests/ docker run --rm curl-impersonate-tests测试原理对每个受支持的浏览器测试会1抓包提取 Client Hello 与 tests/signatures 中记录的已知浏览器签名比对2连接本地nghttpdHTTP/2 服务器比对伪头pseudo-headers与普通头的顺序。已知缺口是尚未测试 HTTP/2 SETTINGS 帧的完全一致性。各浏览器版本与包装脚本的完整对照表记录在 browsers.json 与 README.md。十、常见问题速查问题现象原因与处置curl: (60) Peers Certificate issuer is not recognizedfirefox 版运行时找不到libnssckbi.so中的根证书安装libnss3/nss或交叉编译时用--with-libnssckbi指定路径curl: (77) Problem with the SSL CA cert (path? access rights?)同上NSS 安装于非标准位置或使用--cacert显式指定 CA bundle二进制直接运行签名不对伪装参数由包装脚本附加请用curl_ff*/curl_chrome*等脚本运行或参考 docs/02_USAGE.md 手工补齐 flags交叉编译时找不到 zlib需先为目标架构编译 zlib再用--with-zlibPATH指定Fedora 上 BoringSSL 编译失败见 Makefile.in 的注释需追加-Wno-unknown-warning-option -Wno-stringop-overflow -Wno-array-boundsDockerfile 中亦有等价处理变更安装目录../configure --prefix/your/path定制 curl 构建../configure CURL_CONFIG_FLAGS...如--disable-rtsp十一、小结从 INSTALL.md 出发结合仓库源码可以确认 curl-impersonate 的构建体系是一个全自动依赖流水线无论走 Makefile.in 驱动的主机构建/交叉编译还是走 Dockerfile.template 渲染出的容器构建核心都是brotli nghttp2 特定 TLS 库NSS 或 BoringSSL 打补丁后的 curl并在最后通过特性断言与签名测试来保证产物质量。对普通用户而言最省事的方式是直接使用官方发布GitHub Releases 的预编译二进制或 Docker Hub 镜像详见 README.md需要定制路径、目标架构或深入调试签名时本文的三种构建路径与底层参数说明可以直接作为操作手册使用。赞分享网络安全网络开发工具【免费下载链接】curl-impersonatecurl-impersonate: A special build of curl that can impersonate Chrome Firefox项目地址https://gitcode.com/gh_mirrors/cu/curl-impersonate点击查看免费下载相关推荐从源码构建 VeleroArk编译、镜像、交叉编译与测试验证全指南从源码构建 VeleroArk编译、镜像、交叉编译与测试验证全指南 本文以仓库内历史版本文档 site/content/docs/v0.7.1/build云原生灾备存储后端NodeMCU Firmware 编译指南从 ESP8266 板载编译到 luac.cross 交叉编译与 LFS 镜像构建NodeMCU Firmware 编译指南从 ESP8266 板载编译到 luac.cross 交叉编译与 LFS 镜像构建 NodeMCU 固件内置的 Lu物联网嵌入式用 CMake 构建与安装 RF24从源码编译到交叉编译的完整指南用 CMake 构建与安装 RF24从源码编译到交叉编译的完整指南 本文以 RF24 官方文档《Using CMake》为骨架围绕 nRF24L01 无嵌入式硬件开发上一篇BeepBox音乐创作终极指南零代码制作专业级旋律的免费神器下一篇Tullio.jl 未来展望Julia 张量运算宏的 5 大进化方向与社区发展路线图创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表