codesignature的简单介绍

http://www.itjxue.com  2023-02-09 16:38  来源:未知  点击次数: 

iOS包重签名技术知识

利用Xcode的命令 security 和 codesign 重签ipa文件。重签名与Xcode里用build打包时进行的签名操作是一个原理,具体来说,先了解一下iOS相关的证书类型。

证书类型:

证书作用:

注:

如果是团队开发,一般会生成p12证书提供给组员使用,这样更加好管理证书。

注:

关于证书类型说明:

添加设备UDID到证书:

iPhone手机轻松获取UDID的六种方式 -

1.添加p12证书

2.解压ipa包

3.修改内容

修改Payload/yourName.app中的icon图标、Info.plist文件的信息等,如有需要也可以更改比如版本号,应用名称等。

4.删除之前的签名 _CodeSignature

5.用包里的描述文件生成 entitlements.plist 文件

查看描述文件内容的命令:

上面命令会输出内容:

可以用管道命令 保存成 plist 文件:

如果只保留 Entitlements 属性内容,则可以使用 PlistBuddy 命令,我们重签只需要 Entitlements 属性:

注:本步骤的 Entitlements 属性内容非常重要,不能多字段,或者字段设置true或false错误,都会导致异常情况,否则重签是有效,但导致ipa包安装失败~

6.替换描述文件

把新的描述文件复制替换到解压后的目录中,这个需要看自己需要,旧包的描述权限与新证书的权限,是需要那些,上一步骤中 Entitlements 就是在重签时还可以在指定。

如果需要查看系统中已经保存的描述文件: ~/Library/MobileDevice/Provisioning\ Profiles/

7.给 MachO 文件添加执行权限

解压ipa文件时,app里面的 MachO 文件可能没有执行权限,导致重签的包安装时提示失败。

注,如果Python脚本有对应的库可以查看 MachO,如果是 Shell 脚本,可以利用 Info.plist 文件中已经有 MachO 对应的文件名,可以通过下面命令读取:

当然,一般路径下app的名字与 MachO 一样 Payload/yourAppName.app/yourAppName 。具体方式大家自行选择~

8.获取证书内容

这一步需要读取钥匙串中的开发者证书,可以用以下命令查看下有哪些证书:

上面命令输出:

注意,下面的重签命令,需要使用上面的 "iPhone Developer: ihtcboy@htc.com (8RRC787ZH2)" 参数

9.重新签名

先重签名framework和dylib(不重签的话,就删除无法签名的插件文件: Framework 、 PlugIns 文件夹、 Watch 文件夹)

再签名.app:

注意:签名app需要添加参数 --entitlements entitlements.plist

重签成功后提示:

10.压缩Payload 生成最终 .ipa 文件

用 zip 文件压缩生成最终的重签后的ipa文件

11.验证签名有效性(可选)

macOS 10.11 后, codesign 命令增加了验证签名正确性,当然验证签名信息在真机上进行安装可安装就说明可以用。

验证签名正确性:

查看app的签名信息:

12.删除安装的p12证书(可选)

如果是公共设备环境,可能执行删除命令,删除步骤1中导入的证书。

13.其它可能使用到的命令(可选)

检查一下是否安装了AppleWWDRCA.cer:

查看 app 的 entitlements:

关于 iOS 重签名流程就这样简单和清晰的列出来了,但是有非常多的知识点可以深入,需要大家自行实践,还有很多坑点,这里只是简单提一下,深入的命令使用和证书知识、证书安全、命令的注意事项等,需要大家实践见真知!

iOS ipa重新签名

?一、解压ipa包

1、unzip -q /Users/xiaoconglin/Desktop/packbck/RHDemo_H5.ipa -d /Users/xiaoconglin/Desktop/packbck/resign

?二、列出所有开发者证书文件

1、security find-identity? -v -p codesigning

三、生成entitlements.plist文件

1、security cms -D -i /Users/xiaoconglin/Desktop/packbck/wcyxadhoc.mobileprovision /Users/xiaoconglin/Desktop/packbck/resign/profile.plist

2、/usr/libexec/PlistBuddy -x -c 'Print :Entitlements' /Users/xiaoconglin/Desktop/packbck/resign/profile.plist /Users/xiaoconglin/Desktop/packbck/resign/entitlements.plist

?四、把准备好的开发者证书描述文件复制到XX.app文件夹下

1、cp /Users/xiaoconglin/Desktop/packbck/wcyxadhoc.mobileprovision /Users/xiaoconglin/Desktop/packbck/resign/Payload/大天使之剑.app/embedded.mobileprovision

五、修改包Info.plist中的Bundle Identifier与配置文件中的Bundle Identifier保持一致

1、查看entitlements.plist,获取application-identifier 的值作为app的新bundleidentify

cat /Users/xiaoconglin/Downloads/重签名包/packResign/app-plist/entitlements.plist

2、/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.xy.xxxx" /Users/xiaoconglin/Desktop/packbck/resign/Payload/大天使之剑.app/Info.plist

?六、移除已经签名的_CodeSignature 包括framework里面的

1、rm -rf Payload/XX.app/_CodeSignature

2、rm -rf Payload/XX.app/framework/_CodeSignature

?七、重签名framework,有多少个framewrok 就重签多少

1、/usr/bin/codesign --force --sign 6D9B32BC1A4F36D6E8BD63C05B4B6116775A0D2A --entitlements /Users/xiaoconglin/Desktop/packbck/resign/entitlements.plist /Users/xiaoconglin/Desktop/packbck/resign/Payload/大天使之剑.app/Frameworks/Translate.framework

八、重签名app

1、/usr/bin/codesign --force --sign 6D9B32BC1A4F36D6E8BD63C05B4B6116775A0D2A --entitlements /Users/xiaoconglin/Desktop/packbck/resign/entitlements.plist /Users/xiaoconglin/Desktop/packbck/resign/Payload/大天使之剑.app/大天使之剑

九、压缩

1、cd /Users/xiaoconglin/Desktop/packbck/resign

2、zip -qr seg.ipa Payload/

如何重新签名ipa文件

准备

在重签名之前要做一些准备工作。

1.首先要下载并安装Xcode,里面有个codesign_allocate程序,在安装时/usr/bin中会多一个codesign的程序,该程序用于ipa包的签名。

2.企业证书的Certificate文件,私钥文件,Provisioning Profile文件等。注意企业证书一定要是iOS Distribution的类型,不能是iOS Development。

重签名步骤

1.解压ipa

解压ipa得到Payload/[App name].bundle,打开bundle。

2.删除旧的ipa签名信息

删除bundle中的_CodeSignature文件夹,也就是删除之前ipa的签名信息。

3.更换证书

将bundle中旧的Provisioning Profile删除,用我们自己的企业证书的Provisioning Profile替代。

注意,要将ipa包中我们的企业证书改名为embedded.mobileprovision。

4.修改bundle内容

此时我们可以尽情地修改bundle中的内容,例如添加一个动态库,删除一张图片等。

注意:如果要往bundle中添加动态库,必须要先将其压缩成zip文件,在程序启动时将其解压到Documents目录下再dlopen,否则程序在启动时加载动态库文件会卡死在那里。

5.重新签名

在完成bundle内容的修改后,需要通过/usr/bin/codesign程序重新签名,命令如下:

/usr/bin/codesign -f -s "iPhone Distribution: YourCompanyName" --resource-rules Payload/ MYAPP.app/ResourceRules.plist Payload/ MYAPP.app

其中iPhone Distribution可以从钥匙串访问中获取,就是企业证书的名字,例如下面的"iPhone Distribution:XXXXXXXXXX":

具体的命令示例:

codesign -f -s "iPhone Developer: XXXXXXXXXX" --resource-rules Payload/NdCP_Game_Demo.app/ResourceRules.plist Payload/NdCP_Game_Demo.app

这条命令的意思是:使用keychain中"iPhone Developer: XXXXXXXXXX"标识的证书,根据Payload/NdCP_Game_Demo.app/ResourceRules.plist文件中的规则进行签名,如果ipa包中已经存在签名,那么将被替换,该过程生成的_CodeSignature目录将存放在Payload/NdCP_Game_Demo.app目录下。

在命令执行后,在bundle中会生成一个新的_CodeSignature目录,里面包含了新的签名信息。

6.重新打包成ipa

在完成上述工作后,可以生成新的ipa进行发布。示例命令如下:

zip -r ResignTest.ipa Payload

# 注意Payload后面不能有“/”

7.发布

经过打包发布测试,得出结论:对修改了ipa包内容和其中的签名后,重签名的ipa文件可以在非越狱设备和越狱设备上成功安装。注意,是通过带有SSL证书的网站和Apple系统安装的(企业内部分发程序),不是通过PP助手那样的第三方工具安装的。

(责任编辑:IT教学网)

更多

推荐鼠标代码文章