@lynfe/zsign-wasm-resigner-wrapper
v0.2.0
Published
WASM full resigning toolkit packaged with stable src/dist/binary directories.
Readme
zsign — 快速跨平台 iOS 代码签名工具
语言: English | 简体中文
zsign 是一个快速、开源、跨平台的 iOS 代码签名工具,兼容 iOS 12+,可作为 Apple codesign 的替代品。它可以在无需 Xcode、无需 macOS 的环境下,使用自定义证书和描述文件对 .ipa 安装包、Mach-O 二进制文件以及 .app Bundle 进行重签名。适用于 iOS 重签名、dylib 注入、CI/CD 流水线,以及在 Linux / Windows 服务器上分发 IPA 的工作流。
关键词: iOS 签名 · iOS 重签名 · codesign 替代品 · IPA 重签 · Mach-O 签名 · dylib 注入 · iOS 自动化打包 · Linux 签名 iOS · Windows 签名 iOS · p12 签名 · 描述文件 · OCSP 检查 · 临时签名 · ad-hoc 签名
如果这个工具对你有帮助,请点一个 ⭐ Star — zhlynn
目录
功能特性
- 快速 IPA 重签名 — 通过
.zsign_cache持久化缓存,后续签名可跳过未变更的 Mach-O - 跨平台 — 支持 macOS、Linux、Windows、Android、FreeBSD(无需 Xcode)
- dylib 注入 / 移除 — 支持
LC_LOAD_DYLIB与LC_LOAD_WEAK_DYLIB - 多描述文件签名 — 支持 App Extensions 的独立描述文件
- Bundle 信息修改 — 修改 Bundle ID、显示名称、版本号、最低 OS 版本、entitlements
- Ad-hoc 临时签名 — 无需开发者证书即可签名
- 证书 / OCSP 检查 — 解析
.ipa、.p12、.mobileprovision、.cer、.pem、Mach-O 中的证书 - 元数据提取 — 导出
Info.plist字段和应用图标为metadata.json+ PNG - Bundle 清理 — 移除 App Extensions、Watch App、
UISupportedDevices - Files App 集成开关 — 一键开启
UISupportsDocumentBrowser和UIFileSharingEnabled
支持平台
macOS · Linux · Windows · Android · FreeBSD
构建
macOS
brew install pkg-config openssl
git clone https://github.com/zhlynn/zsign.git
cd zsign/build/macos
make clean && makeLinux
Ubuntu / Debian
sudo apt-get install -y git g++ pkg-config libssl-dev
git clone https://github.com/zhlynn/zsign.git
cd zsign/build/linux
make clean && makeRHEL / CentOS / Alma / Rocky
先安装 epel-release:
sudo yum -y install epel-release再构建:
sudo yum install -y git gcc-c++ pkg-config openssl-devel
git clone https://github.com/zhlynn/zsign.git
cd zsign/build/linux
make clean && make链接系统 minizip/zlib
默认构建会编译 src/third-party/ 内置的 zlib + minizip 源码,无需额外安装包。要求禁止捆绑库的包管理器(如 Homebrew)可以改为链接系统库:
make clean && make SYSTEM_MINIZIP=1 # 链接 minizip(需要 pkg-config 能找到 minizip)
make clean && make SYSTEM_MINIZIP=ng # 通过兼容层链接 minizip-ngWindows
使用 Visual Studio 2022 打开 build/windows/vs2022/zsign.sln 进行构建。
使用方法
Usage: zsign [-options] [-k privkey.pem] [-m dev.prov] [-o output.ipa] file|folder
Options:
-k, --pkey 私钥或 p12 文件路径(PEM 或 DER 格式)
-m, --prov 描述文件路径(Extensions 场景可多次使用 -m)
-c, --cert 证书文件路径(PEM 或 DER 格式)
-a, --adhoc 仅进行 ad-hoc 临时签名
-d, --debug 输出调试信息到 .zsign_debug 目录
-f, --force 强制签名,忽略缓存
-o, --output 输出的 ipa 路径
-p, --password 私钥或 p12 文件的密码
-b, --bundle_id 新的 Bundle ID
-n, --bundle_name 新的 Bundle 显示名称
-r, --bundle_version 新的 Bundle 版本号
-e, --entitlements 新的 entitlements 文件
-z, --zip_level 输出 ipa 的压缩等级(0-9)
-l, --dylib 注入 dylib(可多次使用)
-D, --rm_dylib 移除 dylib(可多次使用)
-w, --weak 以 LC_LOAD_WEAK_DYLIB 方式注入
-i, --install 签名后通过 ideviceinstaller 安装
-t, --temp_folder 中间文件的临时目录
-2, --sha256_only 仅使用 SHA256 Code Directory
-C, --check 检查证书有效期及 OCSP 状态
-x, --metadata 导出元数据与图标到指定目录
-R, --rm_provision 签名后移除描述文件
-S, --enable_docs 开启 UISupportsDocumentBrowser 与 UIFileSharingEnabled
-M, --min_version 修改 Info.plist 中的 MinimumOSVersion
-E, --rm_extensions 移除所有 App Extensions(PlugIns/Extensions)
-W, --rm_watch 移除 Bundle 中的 Watch App
-U, --rm_uisd 移除 Info.plist 中的 UISupportedDevices
-P, --inject_extensions 同时把 -l 指定的 dylib 注入到 App Extensions(PlugIns/Extensions)
-q, --quiet 安静模式
-v, --version 显示版本
-h, --help 显示帮助示例
查看 Mach-O 与代码签名信息:
zsign demo.app/demo签名一个 IPA:
zsign -k privkey.pem -m dev.prov -o output.ipa -z 9 demo.ipa使用 p12 签名(带缓存):
zsign -k dev.p12 -p 123 -m dev.prov -o output.ipa demo.app使用 p12 强制签名(不使用缓存):
zsign -f -k dev.p12 -p 123 -m dev.prov -o output.ipa demo.appAd-hoc 临时签名:
zsign -a -o output.ipa demo.ipa注入 dylib 并重签:
zsign -k dev.p12 -p 123 -m dev.prov -l demo.dylib -o output.ipa demo.ipa将 dylib 注入 App 及其扩展:
# App Extensions(PlugIns/*.appex)以独立进程运行,不会继承主 App 注入的 dylib,
# 因此 -P 会把 dylib 也注入到扩展中。dylib 仅在 App 根目录保留一份,扩展通过
# 相对路径引用(@executable_path/../../demo.dylib)。
zsign -k dev.p12 -p 123 -m dev.prov -P -l demo.dylib -o output.ipa demo.ipa修改 Bundle ID 与名称:
zsign -k dev.p12 -p 123 -m dev.prov -b 'com.new.bundle.id' -n 'NewName' -o output.ipa demo.ipa向 Mach-O 注入 dylib(LC_LOAD_DYLIB):
zsign -a -l "@executable_path/demo1.dylib" -l "@executable_path/demo2.dylib" demo.app/execute注入 weak dylib(LC_LOAD_WEAK_DYLIB):
zsign -w -l "@executable_path/demo.dylib" demo.app/execute导出元数据与图标:
zsign -k dev.p12 -p 123 -m dev.prov -x ./metadata -o output.ipa demo.ipa
# 输出 ./metadata/metadata.json 与 ./metadata/<hash>.png开启 Files App 集成:
zsign -k dev.p12 -p 123 -m dev.prov -S -o output.ipa demo.ipa设置最低 iOS 版本:
zsign -k dev.p12 -p 123 -m dev.prov -M 14.0 -o output.ipa demo.ipa移除所有 App Extensions:
zsign -k dev.p12 -p 123 -m dev.prov -E -o output.ipa demo.ipa移除 Watch App:
zsign -k dev.p12 -p 123 -m dev.prov -W -o output.ipa demo.ipa移除 UISupportedDevices:
zsign -k dev.p12 -p 123 -m dev.prov -U -o output.ipa demo.ipa证书检查 (-C)
检查任意支持类型文件中的签名证书,并向 Apple OCSP 服务器查询吊销状态。对 IPA 内部的 Mach-O 可直接读取,无需解压到磁盘。
支持的文件类型: .ipa、.mobileprovision、.p12/.pfx、.cer/.pem、Mach-O 二进制
# 检查 IPA
zsign -C demo.ipa
# 检查描述文件
zsign -C dev.mobileprovision
# 检查 P12/PFX 证书
zsign -C dev.p12 -p 123
# 检查 Mach-O
zsign -C demo.app/demo
# 签名前验证证书
zsign -C -k dev.p12 -p 123 -m dev.prov -o output.ipa demo.ipa输出示例:
>>> Check: demo.ipa (IPA)
>>> Signed: Yes
>>> Name: Apple Distribution: Company Name (TEAMID)
>>> Type: Apple Distribution
>>> Org: Company Name
>>> Team: TEAMID
>>> Serial: XX:XX:XX:XX:XX:XX:XX:XX
>>> Issued: 2025-01-01T00:00:00Z
>>> Expires: 2026-01-01T00:00:00Z (365 days remaining)
>>> Algorithm: RSA 2048-bit
>>> Issuer: Apple Worldwide Developer Relations Certification Authority
>>> OCSP: Valid (ocsp.apple.com)快速重签名
先将 IPA 解压,再对解压后的目录签名。首次签名时 zsign 会在 .zsign_cache 中缓存签名数据;后续更换证书/描述文件再次签名时会复用缓存,比每次都重新跑 codesign 快得多 — 这是 zsign 的核心优势之一。
常见问题
Q: zsign 是否必须在 macOS 或 Xcode 环境下运行?
不需要。zsign 可直接在 Linux、Windows、macOS、Android、FreeBSD 上运行,不依赖 Xcode 或 Apple 的 codesign。
Q: 可以用于 CI/CD 流水线吗? 可以。zsign 是单一可执行文件,天然适合自动化场景,可在 Linux Runner、Docker 镜像、Windows 构建机上运行。
Q: 支持 SHA256-only Code Directory 吗?
支持,使用 -2 / --sha256_only 参数即可。
Q: 相比 Apple 的 codesign 有什么优势?
跨平台运行、支持非 Apple 主机脚本化调用、原生支持 dylib 注入,以及基于缓存的快速重签名。
开源协议
zsign 基于 MIT 协议开源。详见 LICENSE 文件。
