一、准备
- 需要签名的ipa
- 重签名使用到的企业签(.p12)证书,以及(.mobileprovision)描述文件
二、签名
-
前往ipa所在目录:
1 2
ipaDirectory --xxx.ipa
1
cd ipaDirectory
-
修改描述文件名(.mobileprovision)为 embedded.mobileprovision
-
通过 embedded.mobileprovision 生成 embedded.plist
1
security cms -D -i embedded.mobileprovision > embedded.plist
-
通过 embedded.plist 生成 entitlements.plist 文件
1
/usr/libexec/PlistBuddy -x -c 'Print:Entitlements' embedded.plist > entitlements.plist
-
解压 .ipa 文件,可手动解压,也可以命令行解压
1
unzip xxx.ipa
解压后在当前目录下可看到生成一个 Payload 的文件夹
1 2
Payload --xxx.app
其中的 xxx.app 可以右键显示包内容
-
找出并删除 xxx.app 已生成的所有签名文件,即 _CodeSignature 文件夹。这里的 _CodeSignature 不单指 xxx.app/_CodeSignature,还包括动态库以及工程创建的扩展组件(PlugIns)下的签名文件,即:
1 2 3 4 5 6 7 8 9 10
Payload/xxx.app/_CodeSignature Payload/xxx.app/PlugIns/xxxExtension-1.appex/_CodeSignature ··· Payload/xxx.app/PlugIns/xxxExtension-n.appex/_CodeSignature Payload/xxx.app/Frameworks/xxxSDK-1.framework/_CodeSignature ··· Payload/xxx.app/Frameworks/xxxSDK-n.framework/_CodeSignature
可手动前往 xxx.app 下找到后删除,也可命令行删除:
1 2 3 4
rm -rf Payload/xxx.app/_CodeSignature ··· rm -rf Payload/xxx.app/Frameworks/xxxSDK-n.framework/_CodeSignature
-
删除成功以后,需要我们重新签名,接下来使用 codesign 命令依次对动态库进行签名,该过程需要用到证书,由于证书名称比较长,签名前可以先复制企业证书的证书名称(如:iPhone Distribution:XXX Network Technology Co., Ltd.):
1
codesign -f -s "iPhone Distribution:XXX Network Technology Co., Ltd." Payload/xxx.app/Frameworks/xxxSDK.framework
-
接下来对扩展组件(PlugIns)签名,首先我们替换
Payload/xxx.app/PlugIns/xxxExtension-1.appex/embedded.mobileprovision
描述文件为第2步重命名的embedded.mobileprovision
1
cp embedded.mobileprovision Payload/xxx.app/PlugIns/xxxExtension-1.appex/embedded.mobileprovision
然后使用 codesign 命令进行签名:
1
codesign -f -s "iPhone Distribution:XXX Network Technology Co., Ltd." Payload/xxx.app/PlugIns/xxxExtension.appex
如果有多个扩展组件,重复该过程为所以组件签名。
-
最后对 xxx.app 进行重签名,这里同上一步一样, 需要先替换
Payload/xxx.app/embedded.mobileprovision
描述文件为第2步重命名的embedded.mobileprovision
1
cp embedded.mobileprovision Payload/xxx.app/embedded.mobileprovision
重新签名:
1
codesign -f -s "iPhone Distribution:XXX Network Technology Co., Ltd." --no-strict --entitlements=entitlements.plist Payload/xxx.app
等待执行完成即可。
-
查看重签名信息:
1
codesign -vv -d Payload/xxx.app
信息如下:
1 2 3 4 5 6 7 8 9 10 11 12
Identifier=com.xxx.bundleid Format=app bundle with Mach-O thin (arm64) CodeDirectory v=20400 size=175793 flags=0x0(none) hashes=5485+5 location=embedded Signature size=4831 Authority=iPhone Distribution: XXX Network Technology Co., Ltd. Authority=Apple Worldwide Developer Relations Certification Authority Authority=Apple Root CA Signed Time=Jan 15, 2020 at 4:15:04 PM Info.plist entries=39 TeamIdentifier=证书TeamID Sealed Resources version=2 rules=10 files=246 Internal requirements count=1 size=196
-
将签名后的 .app 所在的 Payload 目录压缩为 .ipa
1
zip -r xxx.ipa Payload
签名工具:ResignForiOS