iOS重签名了解一下

作为一个iOS开发者,大家可能或多或少都跟代码签名打过交道,但也可能很多人都没有去深入了解代码签名的流程以及机制,或许是因为业务上并没有这方面的需求,也或许是专注于代码的编写(这个台阶还OK吗)等等。

在真机调试或者分发应用的时候,都需要我们配置好开发证书和描述文件这些操作才可以build success,这个时候相当于开发工具Xcode自动进行了一次签名,相当于用你拥有私钥的证书给app里所有编译成二进制代码的文件进行一次加密,以保证app的完整性。

然鹅,当你有这样的一些需求的时候,合作公司给你丢过来一个ipa包,你需要对包里的一些信息配置进行修改或者替换一些资源文件或者framework,这些操作会破坏原本ipa包的签名,安装在手机上的时候就通过不了苹果的校验,这个时候就需要用上重签名来解决了。对于游戏公司的从业者来说,合作渠道一多就经常需要对游戏包进行重签名以提快出包的速度。

那么对于给ipa包进行重签名,你需要了解以下这些原理以及操作,这里我用adhoc描述文件进行ipa包重签用于分发应用给内部工作人员测试。你需要有一个准备进行签名的ipa包,还需要有一个拥有公钥和私钥的开发证书以及包含这个证书的描述文件。

准备的证书和资源文件

安装证书,可以在钥匙串中看到你所拥有的证书,但是注意要拥有私钥的证书才可以给应用进行签名,也可以在终端上查看可以进行签名的证书列表

$ security find-identity -v -p codesigning

    1) C6C00376F3FAB3BFB33ECCE44D4698B1D5A4E293 "iPhone Distribution: CaiEn Rong (4Q3SJV59SN)"

解压ipa包模拟进行配置文件的修改或者资源的替换,然后把adhoc描述文件拷贝到app包里,改名为embedded.mobileprovision,签名要用到里面的权限列表

$ cp adhoc.mobileprovision Payload/yjcs_18341.app/embedded.mobileprovision

获取完整的权限列表,以plist文件格式导出

$ security cms -D -i adhoc.mobileprovision > entitlements_full.plist

截取其中签名需要用到的entitlements字段的键值

$ /usr/libexec/PlistBuddy -x -c 'Print:Entitlements' entitlements_full.plist > entitlements.plist

iOS重签名了解一下_第1张图片
获取权限列表

接下来进行codesign,替换掉原来的签名,注意,如果修改了framework或者dylib都要对这些资源进行单独的签名

$ /usr/bin/codesign --continue -f -s "iPhone Distribution: CaiEn Rong (4Q3SJV59SN)" --entitlements "entitlements.plist" Payload/yjcs_18341.app

iPhone Distribution: CaiEn Rong (4Q3SJV59SN)是用来签名的证书

entitlements.plist是权限列表

Payload/yjcs_18341.app是app的路径

签名完成查看签名的完整性,没有任何输出就说明是完整的,基于Unix的设计哲学是没有输出就是好的

$ codesign -v Payload/yjcs_18341.app

也可以查看app的具体签名信息,可以看到app的bundle id,签名的证书以及开发团队等信息

$ codesign -vv -d Payload/yjcs_18341.app

最后就是把Payload文件夹压缩成ipa包,完成了一次ipa包的重新签名,你就可以把这个重新签名过的ipa包发给相关人员进行安装测试了。希望会对大家有所帮助

你可能感兴趣的:(iOS重签名了解一下)