您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > IOS

为什么有些APP没有上架App Store?iOS 打包签名内幕

时间:2020-03-03 10:48:41  来源:  作者:

文章转自:开源中国

IOS签名类型有Development、AD-Hoc、In-House与App Store,而打包过程中又涉及到各种证书、Provision Profile、entitlements、CertificateSigningRequest、p12、AppID......各种概念一大堆,本文将从打包签名的原理说起,并梳理完全签名的整体流程,最后讲解重签名的实现以及签名机制中有哪些需要注意防护的要点。

为了保证App的分发平台是可控的,以及保证所有安装到iOS设备上的App都是经过苹果官方允许的,苹果建立了iOS签名打包机制。要了解iOS签名机制的实现,我们首先从签名机制的原理说起。

1. 签名原理

1.1 不对称加密

网络数据的传输可以使用对称加密以及不对称加密的方式进行安全防护,对称加密是指数据发送者(A)和接收者(B)双方进行加解密的密钥是一致的,但这样会增加密钥自身分发的不安全性:比如要如何保证密钥在传递过程中不被泄露。

而不对称加密则由A、B持有一对公私钥进行加解密,公私钥钥匙是成对出现的。对于一个私钥,有且只有一个与其对应的公钥,私钥保密、公钥公开,但是不能通过公钥推导出私钥,使用私钥加密的文件可用公钥解密,反过来公钥加密的文件也只能用私钥进行解密。加密过程如下:

  1. 发送方(A)首先生成一对公私钥钥匙对,私钥自己保管,公钥则任意分发出去(每台iOS设备终端其实已经包含Apple的公钥)。
  2. 发送数据时,发送方使用私钥对原数据加密成密文传输(加密打包ipa);
  3. 接收方(B)收到密文后,使用之前已经获取到的公钥进行解密得到数据内容(iOS设备验证安装ipa)。
为什么有些APP没有上架App Store?iOS 打包签名内幕

 

1.2 数据签名

这里主要解决了两个问题,一个是加密数据大小的问题,另一个是如何验证公钥的有效性。

1.2.1 信息摘要

前面已经讲到,iOS打包安装的过程中会对ipa包进行加解密验证。然而ipa安装包大小动辄就有十几M,大的有好几G,那如果对这么大的数据量进行加解密,肯定效率是非常低的。而信息摘要则是解决了加密数据过大的问题,其原理是对信息内容通过一个很难被逆向推导的公式计算得到一段哈希数值,它具有以下特点:

  • 计算得到的哈希值大小固定,不受原本信息内容大小的影响;
  • 不可逆,根据哈希值无法推断得到原本信息(实际上MD5以及SHA-1算法已经被证明可以被破解);
  • 唯一性,原本信息内容一致,那么哈希值也一致;原数据不同,也不会存在重复的哈希结果。

使用信息摘要技术在数据加密传输时,发送方先对文件内容使用哈希算法进行信息摘要计算,再对摘要内容进行加密,之后将文件内容以及摘要内容(已加密)发送出去。

接收方收到数据后,先解密得到摘要内容,再依据相同的哈希算法对文件内容进行信息摘要计算,最后匹配接收到的哈希值与计算得到的哈希值是否一致,如果一致那就说明传输过程是安全的。

这样也就避免了对整体原数据加解密的计算过程,从而提高了验证效率。

1.2.2 签名证书

不对称加密中的公钥是公开的,谁都可以得到,这样也就存在了不安全性。比如主动攻击者C冒充数据发送者A,将自己伪装后的公钥分发给数据接收者B,从而达到监听A、B之间通信的目的,又或者是对A、B之间的通信数据进行注入攻击。

为什么有些APP没有上架App Store?iOS 打包签名内幕

 

那为了保证获取公钥的安全性,这里引入CA认证(Certificate Authority)。CA是证明公钥合法性的权威机构(Apple就属于CA认证机构),它为每个使用公开密钥的用户发放一个数字证书,数字证书的作用是证明证书中列出的用户合法拥有证书中列出的公开密钥。用户使用CA的公钥对数字证书上的签名进行验证,如果验证通过,也就认为证书内包含的公钥是有效的。

为什么有些APP没有上架App Store?iOS 打包签名内幕

 

CA认证确保了用户公钥使用过程中的安全性,iOS打包需要向苹果开发者中心上传.certSigningRequest文件,然后配置得到各种.cer证书,这些流程中便包括了开发者向Apple CA认证中心注册公钥的过程。

2. iOS签名

2.1 概念要点

  • .certSigningRequest 文件。从mac的钥匙串访问中生成.certSigningRequest文件,这个过程会从Mac终端生成一对钥匙对,私钥存储在Mac中,公钥则包含在.certSigningRequest中。再将.certSigningRequest文件上传到Apple后台即苹果开发者中心,则可以对应生成开发证书或者发布证书(.cer文件)。
  • .cer 文件:Apple后台使用Apple私钥对Mac公钥进行签名后生成的证书。
  • .p12 文件:Mac本地生成的钥匙对私钥。由于私钥是本地私有的,但你可以使用.p12将私钥导出给其他团队成员使用。
  • Identifiers。Identifiers是iOS设备安装应用时用来识别不同App的唯一标识,点击创建App IDs,同时勾选app所包含的权限:APNs、HealthKit、iCloud等。
  • entitlements。App使用到的各种权限(APNs、HealthKit、iCloud等),也是需要Apple验证通过后才能生效的,Apple将这些权限开关统一称为Entitlements。当第一次在Xcode中勾选权限时,项目中会自动生成一个.entitlements后缀的文件,里面记录了App所拥有的权限。
  • Profiles。.cer文件只是声明了证书的类型,比如Apple Development、Apple Distribution、APNs推送等等,而至于使用什么证书打包、AppID是什么、打包的App包含了哪些功能、可以在哪些设备上安装,则是通过Provisioning Profile 描述文件(.mobileprovision后缀)来说明的,苹果后台将所有这些信息组合后再使用Apple私钥进行签名,最后生成Provisioning Profile描述文件:

2.2 AppStore签名

发布App至AppStore之前需要经过苹果后台审核,审核通过苹果后台会用Apple私钥对App数据进行加密签名生成ipa包;用户从AppStore下载App后,使用设备内置的Apple公钥解密验证,验证通过安装成功。由于AppStore分发的过程中上传审核、下载安装的整个过程都处在苹果的生态链内,所以只需要一次验证就能保证安全性。

为什么有些APP没有上架App Store?iOS 打包签名内幕

 

2.3 其他签名

从AppStore下载安装App只需要一次数字签名就足以保证安全性,但除了这种途径苹果还有其他的安装方式:

  • 开发中连接设备到Xcode进行调试安装
  • AD-Hoc内部测试安装,需要先获取设备UDID并注册,并且有最多100台设备的限制
  • In-House企业内部分发,安装设备数量无限制,但安装后需主动在设置中选择信任证书

那这些安装App的过程中苹果又是怎样保证流程安全性的呢?答案就是双重签名机制,苹果使用前面讲到的Mac本地钥匙对以及Apple后台钥匙对进行多次数字签名,从而保证整体流程的可控。

  1. Mac 钥匙串访问 在本地生成一对公私钥钥匙对,下面默认为公钥L私钥L(L:Local)。
  2. Apple已有一对公私钥钥匙对,私钥A在Apple后台,公钥A内置到每一台iOS设备终端(A:Apple)。
  3. 上传公钥L至Apple后台,使用私钥L公钥L进行数字签名生成签名证书.cer,同时使用私钥L对额外信息(使用什么证书打包、AppID、打包的App包含了哪些功能、可以在哪些设备上安装)进行签名生成描述文件Provisioning Profile,之后将.cerProvisioning Profile下载安装到Mac机器上。
  4. 编译打包app,选择签名证书.cer,打包指令会自动找到该证书对应的私钥L(能匹配是因为钥匙对是成对出现的,前提是本地必须已经存在L私钥,也就是p12的安装),然后使用私钥L对app进行签名。这些签名数据包含两部分:Mach-O可执行文件会把签名直接写入这个文件中,其他资源文件则会保存在_CodeSignature目录下。你可以将打包生成的.ipa文件另存为.zip,解压后对Payload文件夹中的.app文件右键、显示包内容,就可以看到签名数据。另外签名过程中对于App内包含的动态库以及插件(Plugins、Watch、Frameworks文件夹),每一个都会单独进行一次签名,并生成各自的Mach-O可执行文件和_CodeSignature。签名数据指代码内容、App包含的所有资源文件,只要其中有任何改动,都必须重新签名才有效。
  5. 打包的过程中会将描述文件Provisioning Profile命名为embedded.mobileprovision放入到打包app中。
  6. 安装/启动,iOS设备使用内置的公钥A验证embedded.mobileprovision是否有效(设备是否在允许安装列表内),同时再次验证里面包含的.cer证书签名是否有效(证书过期与否)并取出公钥L
  7. embedded.mobileprovision验证通过,就使用公钥L解密验证app签名信息:AppID是否对应、权限开关是否跟app里的entitlements一致等等。
  8. 所有验证通过,安装/启动完成。
为什么有些APP没有上架App Store?iOS 打包签名内幕

 

以上流程便是开发调试、AD-Hoc、In-House等方式打包安装App的过程,区别只在于第⑤步中设备IDs的匹配规则不一致。开发调试只安装当前联调的设备;AD-Hoc允许安装到已在开发者账号下注册过的设备,且每年最多允许100台;In-House无设备数量限制,常用于企业内部App的分发。

3. ipa包重签名

ipa包重签名主要针对的是非App Store的安装包,App Store分发最终是上传ipa文件到苹果后台审核,通过后使用Apple私钥加密,然后才能发布安装,不存在重签入侵的可能。而开发调试、AD-Hoc、In-House等分发途径生成的ipa包不存在苹果后台验证的步骤,这也就意味着你可以对任意的.app、 .ipa文件进行重签名。

回顾前面讲到的签名流程,真正对ipa包进行签名的关键步骤(④⑤)是在Mac本地进行的,签名过程中需要满足三个条件:App即软件代码编译生成的产物、p12证书以及Provisioning Profile配置文件。其中App的内容是动态变动的,Apple不会去验证它,实际上也无需验证,因为在开发调试过程中,所开发的App肯定是不停的迭代变化的,如果需要上线App Store那Apple只需在审核阶段对App内容进行把关验证即可,而其他分发渠道它则管不了。p12以及Provisioning Profile则是下载后主动安装的,大部分情况下都是由管理员创建下载好之后,导出分发给团队成员。

3.1 签名指令

iOS签名调用的是codesign指令,你也可以直接使用相关指令进行签名,下面是codesign的常用指令:

# MAC终端输入: codesign --help
codesign --help
Usage: codesign -s identity [-fv*] [-o flags] [-r reqs] [-i ident] path ... # sign
codesign -v [-v*] [-R=<req string>|-R <req file path>] path|[+]pid ... # verify
codesign -d [options] path ... # display contents
codesign -h pid ... # display hosting paths

查看Xcode的编译日志,也可以看到签名的详细信息

为什么有些APP没有上架App Store?iOS 打包签名内幕

 

# 签名指令
codesign -f -s "iphone Distribution: XXX(证书名称)" --entitlements entitlements.plist(Profile配置文件) XXX.app(签名app)

3.2 重签名

  • 首先获取需要重签名的ipa包,注意该ipa包必须是未加密的。如果是从App Store下载的ipa,需要砸壳解密后才能进行重签名,你也可以从越狱平台下载。将获取的.ipa重命名为.zip,然后右键解压,将会生成一个 Payload 文件夹,里面包含.app文件。
  • 将签名证书对应的Provisioning Profile文件重命名为 embedded.mobileprovision,并拷贝放到Payload文件夹中。同时右键.app文件,显示包内容,将前面的embedded.mobileprovision文件再拷贝一份放到.app文件夹中,替换掉原有的embedded.mobileprovision。
  • entitlements.plist是由签名证书对应的Profile配置导出的签名文件,它与前面截图Xcode签名日志中的XXX.xcent文件的作用相同。终端cd到Payload文件夹路径,执行指令# cd xxx/Payload,然后执行下面指令 security cms -D -i embedded.mobileprovision将会打印出Profile配置的内容,找到<key>Entitlements</key>,然后把<key>Entitlements</key>下面<dict>...</dict>的内容拷贝到新建的entitlements.plist文件中(可以通过Xcode生成plist文件,选Property List类型),最后将entitlements.plist文件放到Payload文件夹中。# 拷贝内容为:<dict> ... </dict> <key>Entitlements</key> <dict> <key>application-identifier</key> <string>xxx</string> <key>keychain-access-groups</key> <array> <string>xxx</string> </array> <key>get-task-allow</key> <false/> <key>com.apple.developer.team-identifier</key> <string>xxx</string> </dict>
  • 签名证书名称可以在安装证书后从钥匙串中心查看或者在终端使用以下指令查看:security find-identity -v -p codesigning
  • 准备工作完成,开始重签名。先右键.app显示包内容,查看动态库和插件(Plugins、Watch、Frameworks文件夹),如果是个人证书需要移除Plugins、Watch文件夹,因为个人证书没法签名Extention。如果存在Frameworks,则执行签名指令,有多个的话则每一个Frameworks都要重签一次。
  • codesign -fs "签名证书名称" "Frameworks/xxx.framework(动态库路径)"
  • 最后对app进行重签名
  • codesign -f -s "iPhone Distribution: XXX(证书名称)" --entitlements entitlements.plist(Profile配置文件) XXX.app(签名app)
  • 最后将Payload文件夹下的资源移除,只保留.app文件,右键压缩,然后更改后缀为.ipa,这样重签后的ipa便已生成了,你可以通过iTunes、iTools或其他途径安装到iOS设备上。

3.3 注入代码重签

  • ipa代码注入一般通过动态库来实现。新建动态库在Xcode中选择新建 TARTETS — Framework & Library — Framework,然后在framework中添加自定义代码,一般都是使用Runtime来注入附加功能。最后选择framework要支持的架构,编译后便得到了最终动态库。
  • 对需要重签名的.app右键显示包内容,然后将动态库拷贝到Framework文件夹(没有则新建)中。然而此时动态库与app还没建立关联关系,动态库需要注入MachO中才能生效。注入使用yololib工具,下载yololib并编译,将生产的命令复制到/usr/local/bin或$PATH中的其他路径,便可以在终端使用yololib指令## 通过yololib工具实现注入动态库 yololib "MachO文件路径" "需要注入的动态库路径"注入成功后再对所有Framework签名,最后对app重签名,然后生成ipa文件。这里整理了一份用于重签名的脚本 CJCodeSign,想了解更多关于签名指令的内容可点击查看详情。

3.4 关于重签名的思考

iOS重签名实现,可以发现用于签名的私钥资源(包括.cer证书和Provisioning Profile配置)和实际签名的app包是没有强关联关系的,这也就带来了两方面的问题。

  1. .cer证书和Provisioning Profile配置被用于其他App的分发签名,特别如果是In-House企业类型的证书,那是可以进行无限制分发的,而一旦苹果检测到这种违规签名的行为,轻则撤销证书,重则注销企业开发者账号!这也就是为什么一定要严格把控 p12、Provisioning Profile 文件外发的原因。
  2. 自有App被注入代码后重签名,比如应用多开、添加插件、恶意抓包等等,对于这一类的防护除了对Bundle ID进行检查,以及对App动态库增加白名单检索外好像也没有更好的办法。当然这已经涉及到逆向防护的方向了,本人对此还未深入了解,有兴趣的同学可以一起参与探讨。

全文完

最后再附上重签名脚本地址: CJCodeSign

作者简介:

lele8446,iOS开发深耕者,爱好分享、深⼊探讨有温度的内容,GitHub地址。



Tags:iOS   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
应用锁一直是苹果用户的痛点,毕竟这功能隔壁安卓早就有了。 为什么苹果一直不给上应用锁的功能呢?之前记者也有提问过苹果的前设计师(首席声优)艾维,他说在苹果的逻辑里,手机密码...【详细内容】
2021-12-23  Tags: iOS  点击:(27)  评论:(0)  加入收藏
众所周知,由于今年iOS 15系统的更新幅度不大,导致不少果粉的升级欲望大大降低,iOS 15系统的安装率也远低于去年的iOS 14系列,今年的iOS 15这么拉跨,那么明年的iOS 16呢? 目前关于i...【详细内容】
2021-12-22  Tags: iOS  点击:(9)  评论:(0)  加入收藏
IT之家 12 月 20 日消息,百度网盘青春版 iOS 客户端今日晚间率先开启内测,安卓客户端将在稍后内测。使用苹果 iPhone 的IT之家小伙伴可以点此下载内测版,需要先下载 TestFlight...【详细内容】
2021-12-21  Tags: iOS  点击:(10)  评论:(0)  加入收藏
相信很多小伙伴都遇到过这种情况,一台iPhone放太久了,当初设置的锁屏密码是什么都自己忘了。 这时候我们只能通过连接电脑进入恢复模式再进行刷机或者用另一台iPhone(登录的是...【详细内容】
2021-12-21  Tags: iOS  点击:(16)  评论:(0)  加入收藏
近日苹果发布 iOS 15.2/iPadOS 15.2 正式版的更新,整合了此前测试版中所有新功能,因此更新内容不少,也有一些值得了解的实用功能。有没有必要更新 iOS 15.2 正式版?看完如下功能...【详细内容】
2021-12-17  Tags: iOS  点击:(24)  评论:(0)  加入收藏
虽然手机圈每隔几天就会有新机登场,但依旧有小伙伴表示内心毫无波澜&mdash;&mdash; 「你发任你发,我的小米 6 还能再战两年。」 就算是电池损耗了,按键不灵了,屏幕摔碎了,修一修...【详细内容】
2021-12-16  Tags: iOS  点击:(7)  评论:(0)  加入收藏
苹果昨日向 iPhone 和 iPad 用户推送了 iOS 15.2 / iPadOS 15.2 正式版更新,带来了多项新功能。据 9To5Mac 报道,iOS 15.2 / iPadOS 15.2 还有一项新功能,允许用户不借助 Mac...【详细内容】
2021-12-16  Tags: iOS  点击:(30)  评论:(0)  加入收藏
今天发了几个关于iOS15.2正式版的微头条,没想到引发了大家不小的讨论,看来大家对于新版本还是有不少期待的,不少人今天早上睡醒之后就选择了升级,还有一些小伙伴一直在纠结要不...【详细内容】
2021-12-15  Tags: iOS  点击:(21)  评论:(0)  加入收藏
在今天凌晨,苹果正式上线了 iOS 15.2 正式版 以及 watchOS 8.3 的新版本,这个正式版其实我是一直比较期待的,因为在此前的开发者测试版本中,就一直在内测APP 隐私报告,数字遗产以...【详细内容】
2021-12-15  Tags: iOS  点击:(22)  评论:(0)  加入收藏
【手机中国新闻】随着互联网进一步深入到我们的生活,我们已经与数字化脱不开关系了,同时在网络上拥有很多对于我们而言有价值的事物。因此,有不少网友在思考,自己故去以后,网络上...【详细内容】
2021-12-14  Tags: iOS  点击:(9)  评论:(0)  加入收藏
▌简易百科推荐
前言最近对 WebRTC iOS 端源码进行了下载和编译,网上针对 WebRTC iOS 端的编译文章基本都是几年前的,有些地方已经不适用于最新版的 WebRTC 的编译,简单记录下载&编译的过程,以...【详细内容】
2021-11-10  anyRTC云平台    Tags:WebRTC iOS   点击:(38)  评论:(0)  加入收藏
IT之家 10 月 20 日消息,据 9to5 Mac 报道,继 iOS 15.1 RC、macOS Monterey RC 和其他更新发布后,苹果也向开发者提供了 Xcode 13.1 RC(候选版)。最新版本的 Xcode 现在可以在苹...【详细内容】
2021-10-20    IT之家  Tags:Xcode   点击:(88)  评论:(0)  加入收藏
IT之家 8 月 12 日消 苹果今日发布了一款新的开发者工具,旨在强制那些运行 iOS 15 和 iPadOS 15 的设备在使用不安全的 WiFi 网络或 WiFi 速度较慢时优先使用 5G 连接而不是...【详细内容】
2021-08-12    IT之家  Tags: iOS   点击:(151)  评论:(0)  加入收藏
IT之家4月7日消息 去年底,苹果公司要求应用商店所有第三方软件都必须增加 “隐私标签”以进一步保护消费者隐私安全。之后,谷歌旗下大量 iOS 软件长时间停止更新。而到了今年...【详细内容】
2021-04-07    IT之家  Tags:苹果隐私标签   点击:(309)  评论:(0)  加入收藏
你们好,这里是Seek思科,为你寻找苹果最新资讯、苹果隐藏技巧、苹果良心APP以及苹果优质配件。如果你需要这些,不妨点个关注。苹果已经官宣今年全球开发者大会将在北京时间6月8...【详细内容】
2021-04-02  Seek思科  今日头条  Tags:iOS15系统   点击:(370)  评论:(0)  加入收藏
Sideloadly安装unc0ver越狱 今天推荐比Altstore更简单的安装工具,Sideloadly 在QQ群文件下载最新版本安装, 然后直接打开,演示是Mac版本 Win是一模一样的, 不会出现报错2或...【详细内容】
2021-03-30  CydiaInstaller  今日头条  Tags:iOS自签名   点击:(1279)  评论:(0)  加入收藏
就在昨日,苹果对《App Store 审核指南》进行了2021年的首次重大更新。而此次更新主要是为了方便开发者为即将发布的OS版本中的新功能提供支持,更好地保护用户,并帮助开发者的Ap...【详细内容】
2021-02-03      Tags:App Store   点击:(205)  评论:(0)  加入收藏
不用不上架、不越狱、不要企业证书、永不掉签 只需一个h5网站地址 就能创建属于您自己的苹果IOS APP_多啦咪资源网无需越狱 无需企业证书 不用上架appStore 界面全屏 无广告...【详细内容】
2020-12-11      Tags:APP   点击:(177)  评论:(0)  加入收藏
iOS14支持把小组件添加到桌面,不过我们之前推荐的都是一些工具类的或者是桌面美化类的小组件,今天我们来看看目前有哪些我们常用的App已经支持把小组件添加到桌面了。 网易云...【详细内容】
2020-11-26      Tags:iOS   点击:(185)  评论:(0)  加入收藏
简介: 在平时的面试中,经常问到的高频面试题大概做了一个总结,希望能帮到你!一、如何绘制UIView?绘制一个UIView最灵活的方法就是由它自己完成绘制。实际上你不是绘制一个UIView...【详细内容】
2020-11-13      Tags:iOS   点击:(146)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条