深度解析AssppWeb的Wisp协议WebSocket盲隧道与libcurl.js WASM实现TLS 1.3【免费下载链接】AssppWeb项目地址: https://gitcode.com/gh_mirrors/as/AssppWebAssppWeb 是一款开源的iOS 应用网页版下载与安装工具登录 Apple ID、搜索应用、获取许可证并安装 IPA。它的架构核心是一套被称为零信任Zero-Trust的设计所有与 Apple 服务器的通信都在你的浏览器里完成——通过 WebAssembly 版 libcurl.js 实现TLS 1.3加密而服务端只是一条基于Wisp 协议的WebSocket 盲隧道永远看不到你的 Apple 账号凭证。这篇文章带你从原理到落地完整拆解这套 Wisp 协议盲隧道 libcurl.js WASM 的浏览器端 TLS 1.3 实现。零信任架构为什么服务器必须看不见你的密码传统 Web 工具的做法是用户把 Apple ID 密码提交给后端由后端代用户去请求 Apple。这意味着服务器随时可能泄露、或被攻击者利用你的凭证。AssppWeb 反其道而行服务器永远不接触 Apple 凭证。浏览器直接和 Apple 服务器对话TLS 在浏览器内终结服务器只负责把加密后的字节流原样转发——它看到的全是密文。这种设计带来一个天然优势即使服务器被攻破攻击者也拿不到任何账号密码、Cookie 或令牌。E2E 测试甚至专门扫描后端日志验证其中只出现连接元数据、没有任何凭证信息见 AGENTS.md 中的 Security Model 章节。AssppWeb 是什么先看看它长什么样在使用层面AssppWeb 就是一个清爽的网页应用添加 Apple 账号 → 搜索应用 → 下载 → 通过itms-services://安装到 iPhone。左侧是导航栏首页、账号、搜索、下载、设置右侧是下载任务列表。所有 Apple 协议交互认证、购买、获取下载信息都发生在浏览器内界面上的每个状态背后正是下一节要讲的 Wisp 隧道在工作。Wisp 协议详解把 WebSocket 变成盲 TCP 隧道一条 WebSocket承载多条 TCP 连接Wisp 协议由mercuryworkshop/wisp-js实现的核心思想是在一条 WebSocket 连接上复用multiplex多条 TCP 数据流。浏览器里的 libcurl 不需要也不允许直接发起任意外部 TCP 连接而是浏览器建立一条指向本服务器的 WebSocket路径/wisp/libcurl 在隧道内部请求连接buy.itunes.apple.com:443Wisp 服务端在服务器侧真正建立到 Apple 的 TCP 连接之后的所有字节已是 TLS 1.3 密文就在这条 WebSocket 里双向搬运关键就在盲blind这个字TLS 握手在浏览器内完成Apple 的证书验证也在浏览器内完成服务器转发的每一个字节对它来说都是无意义的密文。盲性如何保证看一行核心配置整个 Wisp 代理的入口只有寥寥几行逻辑集中在 backend/src/services/wsProxy.tswisp.routeRequest(req, socket, head);它只做一件事把 WebSocket upgrade 请求交给 Wisp 服务器处理。没有日志解析、没有请求改写、没有解密——盲性是靠不碰数据来保证的而不是靠承诺不看。安全护栏域名白名单与端口限制盲隧道听起来很灵活但也有被滥用的风险比如被当作跳板扫描内网。AssppWeb 在 backend/src/services/wsProxy.ts 中做了严格限制完整选项说明见 backend/src/types/wisp-js.d.ts配置项取值作用hostname_whitelistauth/buy/init.itunes.apple.com、p\d-buy.*、downloaddispatch.*只允许 Apple 官方业务域名port_whitelist443只允许 TLS 端口allow_direct_ipfalse禁止直连 IP 绕过域名白名单allow_loopback_ipsfalse禁止指向回环地址allow_private_ipstrue仅因容器 DNS 可能把白名单域名解析到保留地址段域名白名单仍是第一道防线测试用例 backend/tests/wsProxy.test.ts 验证了三件事/wisp/路径接受连接、非 Wisp 路径一律拒绝、随机路径一律拒绝——攻击面被压到最小。libcurl.jsWebAssembly 在浏览器里跑 TLS 1.3为什么要把 libcurl 编译成 WASM浏览器原生的fetch无法访问 Apple 的部分接口需要精确控制 Cookie、跟随特定重定向、模拟Configurator客户端行为。AssppWeb 的解决方案是把完整的 libcurl 编译成 WebAssembly直接在浏览器里运行——获得和桌面客户端几乎一致的 HTTP 能力。初始化逻辑非常直观见 frontend/src/apple/libcurl-init.tslet wsUrl ${wsProto}//${location.host}/wisp/; libcurl.set_websocket(wsUrl); // 让 libcurl 走 Wisp 隧道 await libcurl.load_wasm(); // 加载 WASM 模块两行关键代码set_websocket把 libcurl 的出站 TCP 重定向到 Wisp 隧道load_wasm加载编译好的 libcurl 模块。Mbed TLS 与 TLS 1.3握手终结在浏览器libcurl.js 内置Mbed TLS这意味着TLS 1.3 握手在浏览器中完成证书链在浏览器中验证Apple 服务器的私钥/证书信息只有浏览器知道服务端拿到的只是隧道里流动的密文所有 Apple API 调用都通过统一的封装 frontend/src/apple/request.ts 发出例如账号认证请求在 frontend/src/apple/authenticate.ts 中拼装 plist 后经由appleRequest()发出。有意思的一个细节Apple 的init.itunes.apple.com接口强制要求 TLS 1.3早期基于 node-forge 的浏览器端方案根本支持不了——这正是改用 libcurl.jsMbed TLS 1.3的直接动因背景可参考 backend/src/routes/bag.ts 中的注释。完整请求流程从登录到拿到 App把前面的积木拼起来一次完整的零信任下载是这样走的Bag 预取服务端代劳因为无凭证浏览器调GET /api/bag?guid设备ID后端用 Node 原生 HTTPS 抓取init.itunes.apple.com/bag.xml返回 Apple 官方服务地址。见 backend/src/routes/bag.ts认证浏览器内 libcurl.js 经 Wisp 隧道直连auth.itunes.apple.comTLS 1.3 全程在浏览器中完成拿到passwordToken、Cookie、pod购买/获取许可证连p{pod}-buy.itunes.apple.com同样是盲隧道获取下载信息拿到 Apple CDN 的公共下载 URL、SINF 签名和元数据服务端编译 IPA浏览器把不含任何凭证的{ downloadURL, sinfs, metadata }提交给后端后端从 CDN 下载 IPA、注入 SINF生成可通过itms-services://安装的 manifest整个流程中服务器接触到的最多是公共 CDN 地址 应用元数据凭证从未过境。自托管部署反向代理里唯一要关心的一点Wisp 隧道跑在 WebSocket 上路径/wisp/这意味着自托管时反向代理必须放行 WebSocket 升级请求否则应用无法与 Apple 通信。官方 README.md 特别强调确保 Nginx、Cloudflare 等代理配置允许 WebSocket 连接否则应用将无法与 Apple 服务器通信。其他常见配置Docker Compose 一键启动curl -O https://raw.githubusercontent.com/Lakr233/AssppWeb/main/compose.yml docker compose up -d本地仓库同样提供 compose.ymliOS 安装链接要求 HTTPS需挂到带有效证书的反向代理之后可选ACCESS_PASSWORD为界面和 API 增加访问密码启用后 Wisp 连接需携带?token鉴权见 backend/src/services/wsProxy.tsCloudflare Workers Containers 部署入口见 cloudflare/src/index.ts⚠️ 安全提示来自官方 README没有任何官方公网实例公共实例请自行评估风险——恶意主机可以替换前端页面来窃取凭证。强烈建议自托管并始终核对 SSL 证书。总结AssppWeb 用一套非常克制但完整的工程手段回答了一个经典难题——如何让 Web 工具经手敏感凭证却不真正经手组件角色关键点Wisp 协议WebSocket 盲隧道多路复用 TCP服务端零解密、域名白名单锁死攻击面libcurl.js (WASM)浏览器端 HTTP 客户端完整 libcurl 能力跑在 WebAssembly 里Mbed TLS 1.3浏览器端 TLS握手与证书验证终结于浏览器满足 Apple 的 TLS 1.3 强制要求Bag 代理唯一的服务端代访只返回公共 URL无凭证参与核心源码路径一览方便继续深入Wisp 代理与白名单backend/src/services/wsProxy.tsWASM 初始化frontend/src/apple/libcurl-init.tsApple 请求封装frontend/src/apple/request.ts认证流程frontend/src/apple/authenticate.ts架构文档零信任总览AGENTS.md这套浏览器终结 TLS 服务端盲转发的架构对任何需要处理敏感凭证的 Web 应用都值得借鉴。【免费下载链接】AssppWeb项目地址: https://gitcode.com/gh_mirrors/as/AssppWeb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
treg多团队切换实战:一个账号管理10个团队的完整教程 treg多团队切换实战:一个账号管理10个团队的完整教程 【免费下载链接】treg OpenRouter for agent tools. Join community here: https://discord.gg/6mQYYfFMAn 项目地址: https://gitcode.com/GitHub_Trending/treg/treg
treg 是一个开源的 Agent 工具网关… · 2026/9/25 14:30:02
Status Deck:用 Go+Vue 打造常驻桌面的全栈状态仪表盘 Status Deck 这个名字是我在一个周五下午想出来的。当时桌面上同时开着七个终端窗口、两个浏览器标签页挂着流水线结果、一个备忘录记着今天要合的改动,屏幕最右边还贴着一张便利贴写着服务器磁盘水位。盯了十分钟之后我意识到一件事:这些信息没有一个是… · 2026/9/25 15:10:59
电源芯片替代的五维系统化选型方法 1. 为什么“替代”不是换颗料那么简单——电源芯片选型的系统性陷阱我第一次接手电源芯片替代任务时,以为就是查个参数表、找颗封装一样的料,焊上去测个电压就完事。结果那块板子在客户现场连续烧了三批,每批12台设备,返工成本加上… · 2026/9/25 15:10:53
多协议以太网温湿度变送器在楼宇自控中的选型与部署要点 作为在楼宇自控行业摸爬滚打十几年的老工程师,这几年感触最深的变化,就是温湿度变送器这类最基础的传感设备,正在从“能测就行”快速转向“能接入、能互通、能联动”。越来越多的智慧楼宇项目在采购温湿度变送器时,已经不满足于传… · 2026/9/25 15:10:40
瀚高数据库抽取工具选型与实战:从pg_dump到逻辑复制 简介:面向Oracle数据库向瀚高(HGDB)迁移与同步场景的专用抽取工具,适合需要完成数据库升级、异构数据迁移或双库一致维护的DBA与实施人员。工具围绕ETL流程设计,支持从Oracle抽取数据、自动进行类型与结构转换后写入瀚… · 2026/9/25 15:10:34
SoC低功耗唤醒失败排查:PLL锁定后系统无响应的根因与解决 1. 唤醒失败的现场:PLL锁定灯亮了,系统却像死机一样如果你做过SoC低功耗相关的开发,大概率遇到过这种让人抓狂的场景:调试串口打印出PLL的LOCK位已经置1,时钟树看起来一切正常,但CPU就是卡在唤醒流程里出不… · 2026/9/25 15:10:34
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37