美文网首页
iOS重签名了解一下

iOS重签名了解一下

作者: mai111 | 来源:发表于2021-08-17 19:03 被阅读0次

    什么是代码签名

    • 签名: 确保被签名文件的有效性
    • 代码签名:iOS里的代码签名,简单概括就是用Mac上的私钥,对app进行一次签名,确保app的完整,防止别人篡改

    回顾一下打包app的过程,要做哪些操作
    Certificates:需要从证书颁发机构CA那里创建一个.certSigningRequest文件,这是使用非对称加密创建的一对密钥,私钥存在Mac里,公钥就是.certSigningRequest要上传到apple的开发者后台。apple用自己的私钥对.certSigningRequest文件进行签名生成.cer证书,把这个.cer下载下来安装到Mac上,当导出P12格式的证书时会把Mac的私钥一起导出生成P12证书。
    Identifiers:创建app的Bundle ID,在创建appid的时候会勾选app用到的哪些权限,比如
    Game Center、In-App Purchase、Sign In with Apple等。
    Devices:需要调试设备的UDID
    Profiles:根据Certificates、Identifiers、Devices生成的描述文件*.mobileprovision
    展开mobileprovision可以看到描述文件里包含了Certificates证书、app ID和包含的Entitlements权限、Devices设备的UDID


    在打包app的时候Xcode用证书和描述文件对app进行了一次签名。

    为什么要重签名

    有时候在处理app的时候,需要对app里面的资源进行增删改查的操作,例如更换启动图,修改bundle,修改动态库等,这会破坏原来打包app时候的签名,导致app安装失败,就是安装的时候iOS的系统校验签名失败,需要重新签名才可以安装。

    从上面可以知道描述文件里包含了CertificatesIdentifiersDevices等信息,签名的时候需要描述文件里包含的Certificates证书跟所签名的P12证书信息一致才会签名成功,但神奇的是并不需要描述文件里包含的app ID和工程里的app ID(info.plist里的Bundle ID)一致就可以签名成功,所以这也衍生出了超级签企业签等应用场景,只要我有包含私钥的P12证书和包含这个证书的描述文件,就可以给任意的app签名。

    如何进行重签名

    对app进行重签名,首先得有个app吧,使用Xcode打包出来的是ipa包,ipa包解压出来的结构是Payload/*.app


    有app包之后,重签名需要用到包含Mac私钥的P12证书,包含证书、app ID、device ID的描述文件.mobileprovision

    把P12证书安装到Mac上后,要获取到这个证书的ID,以下命令可以查看电脑上所安装的所有证书,找到对应的证书ID,使用证书ID或者证书名字都可以
    $ security find-identity -v -p codesigning
    
        1) C6C00376F3FAB3BFB33ECCE44D4698B1D5A4E293 "iPhone Distribution: CaiEn Rong (4Q3SJV59SN)"
    

    把描述文件adhoc.mobileprovision拷贝到app的根路径里,名字改为embedded.mobileprovision,名字是固定写法

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

    把描述文件adhoc.mobileprovision转成.plist文件格式输出,方便后续获取其中的权限列表

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

    截取描述文件中的权限文件,用于app的签名

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

    用前面获取到的证书ID或者证书名字、描述文件里获取到的权限列表对app进行签名
    如果app内包含了动态库,需要先对动态库进行签名,再对app签名,区别是动态库的签名不需要附加权限列表,动态库的路径是Payload/*.app/Frameworks/*.framework,以下是对动态库进行签名,如果app中没有动态库,可以跳过

    $ /usr/bin/codesign --continue -f -s "iPhone Distribution: CaiEn Rong (4Q3SJV59SN)" Payload/*.app/Frameworks/*.framework
    

    接着对app进行签名,以下命令

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

    签名完成后,可以校验一波签名是否有效,如果没有任何输出,这说明签名有效,Unix的设计就是这样,没有输出就是最好的输出

    $ codesign -v Payload/*.app
    

    最后把Payload文件压缩一波,改成ipa格式就可以使用了。

    相关文章

      网友评论

          本文标题:iOS重签名了解一下

          本文链接:https://www.haomeiwen.com/subject/xogbbltx.html