简介:iOS签名类型包括开发、临时、内部和应用商店,打包过程涉及各种证书、配置文件、授权、CertificateSigningRequest、p12、AppID、...很多概念 。本文将从包签名的原理入手,梳理完整签名的全过程,最后说明重签名的实现以及签名机制中的保护要点 。
为了确保应用的分发平台可控,以及iOS设备上安装的所有应用都经过苹果官方认可,苹果建立了iOS签名打包机制 。要了解iOS签名机制的实现,我们先从签名机制的原理说起 。
1.签名原则1.1不对称加密数据在网络中的传输可以通过对称加密和非对称加密来保护 。对称加密是指数据发送方(A)和接收方(B)的加解密密钥是相同的,但这会增加密钥分发本身的不安全性:比如如何保证密钥在传输过程中不被泄露 。
非对称加密是由持有一对公钥和私钥的A和B进行加密,公钥和私钥对成对出现 。对于私钥,只有一个公钥与之对应 。私钥是保密的和公开的,但是私钥不能从公钥推导出来 。用私钥加密的文件可以用公钥解密,用公钥加密的文件只能用私钥解密 。加密过程如下:
1.发送方(A)先生成一对公私钥对,私钥自己保管,公钥任意分发(每个iOS设备终端实际上已经包含了苹果的公钥) 。
2.发送数据时,发送方使用私钥将原始数据加密成密文传输(加密打包的IPA);
3.接收方(B)收到密文后,用之前获取的公钥解密,得到数据内容(iOS设备验证并安装ipa) 。
1.2数据签名本文主要解决两个问题,一是加密数据的大小,二是如何验证公钥的有效性 。
1.2.1信息概述如前所述,在iOS包安装期间,ipa包将被加密和解密 。但是ipa安装包有十几米大小,几克大小,所以这么大的数据量如果加密解密,效率肯定是很低的 。消息摘要解决了加密数据过大的问题 。其原理是通过一个难以逆向推导的公式计算出一个哈希值 。它具有以下特点:
计算得到的哈希值大小固定,不受原本信息内容大小的影响;不可逆,根据哈希值无法推断得到原本信息(实际上MD5以及SHA-1算法已经被证明可以被破解);唯一性,原本信息内容一致,那么哈希值也一致;反过来理论上不同内容的原数据可能会碰撞产生相同的哈希值(这也就是上面说到的被破解),但碰撞概率的大小受哈希函数的影响,而且这只是理论上的概率事件可以认为这并不影响信息摘要在iOS签名中的使用 。
【CA是什么机构 什么是CA】使用信息摘要技术加密传输数据时,发送方首先使用哈希算法计算文件内容的信息摘要,然后对摘要内容进行加密,再发送文件内容和摘要内容(加密) 。
接收方接收到数据后,解密得到摘要内容,然后根据相同的哈希算法计算文件内容的信息摘要,最后匹配接收到的哈希值与计算出的哈希值是否一致 。如果是,传输过程是安全的 。
这样就避免了对整个原始数据进行加密和解密的计算过程,提高了验证效率 。
签名证书非对称加密中的公钥是公开的,任何人都可以获得,因此存在不安全性 。比如主动攻击者C伪装成数据发送方A,将其伪装的公钥分发给数据接收方B,从而监听A和B之间的通信,或者注入A和B之间的通信数据 。
然后,为了保证获取公钥的安全性,这里引入了CA认证机构 。CA是证明公钥合法性的权威机构(苹果属于CA认证机构) 。它向每个使用公钥的用户颁发一个数字证书 。数字证书的作用是证明证书中列出的用户合法拥有证书中列出的公钥 。使用用户CA的公钥来验证数字证书上的签名 。如果验证通过,则证书中包含的公钥被视为有效 。
CA确保用户公钥的安全性 。iOS打包需要上传` 。certSigningRequest文件到Apple Developer Center,然后配置它以获得各种` 。cer `证书 。这些过程包括开发者向苹果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之前,需要经过苹果的后台审核 。审核后,苹果后台会用苹果私钥对app数据进行加密签名,生成ipa包;用户从AppStore下载App后,用设备内置的苹果公钥解密验证,验证成功安装 。由于AppStore分发过程中的上传、审核、下载、安装全过程都在苹果的生态链中,只需要一次验证就能保证安全 。
2.3其他签名从AppStore下载安装应用只需要一个数字签名就能保证安全,但苹果除了这种方式还有其他安装方式:
开发中连接设备到Xcode进行调试安装AD-Hoc内部测试安装,需要先获取设备UDID并注册,并且有最多100台设备的限制In-House企业内部分发,安装设备数量无限制,但安装后需主动在设置中选择信任证书
苹果在安装这些app的过程中是如何保证进程安全的?答案是双重签名机制 。苹果使用前面提到的Mac本地密钥对和苹果后台密钥对进行多次数字签名,保证了整个过程的可控性 。
1.Mac钥匙串访问在本地生成一对公钥和私钥对,默认为公钥L和私钥L (L(L:Local) 。
2.Apple有一对公钥和私钥对 。私钥A在苹果后台,公钥A内置在每一个iOS设备终端(A:苹果) 。
3.将公钥L上传到Apple的后台,用私钥A对公钥L进行数字签名,生成签名证书 。cer,同时使用私钥A对附加信息(什么证书包,AppID,打包的App包含什么功能,可以安装在哪些设备上)进行签名,生成描述文件Provisioning Profile,然后下载安装 。Mac计算机上的cer和预置描述文件 。
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.mobile条款之后,将使用公钥L来解密和验证app的签名信息:AppID是否对应,权限切换是否与app中的授权一致,等等 。
8.所有验证均通过,安装/启动完成 。
以上流程是开发调试、AD-Hoc、内部等方式打包安装App的过程 。唯一不同的是步骤⑤中设备id的匹配规则不一致 。只调试和安装当前调试的设备;AD-Hoc允许安装到开发者账号下注册的设备,每年最多100台设备;内部对设备数量没有限制,通常用于在企业内部分发应用程序 。
3.IPA包的重新签名Ipa重签主要针对非App Store安装包 。App Store分发最终上传ipa文件给苹果进行后台审核 。通过后用苹果私钥加密,才可以发布安装 。不存在重签入侵的可能 。但是对于开发调试、AD-Hoc、内部等发行渠道生成的ipa包,没有Apple后台验证步骤,也就是说你可以任意重签 。app和 。ipa文件 。
回顾前面提到的签名过程,真正对ipa包进行签名的关键步骤(④ ⑤)是在Mac本地进行的,签名过程需要满足三个条件:App是软件代码编译的产物,p12证书和Provisioning Profile配置文件 。App的内容是动态变化的,所以苹果不会验证,事实上也不需要验证,因为在开发调试的过程中,开发出来的App肯定是不断迭代变化的 。如果需要上线App Store,那么苹果只需要在审核阶段对App的内容进行检查和验证,而无法管理其他的分发渠道 。P12和预置描述文件是在下载后主动安装的 。在大多数情况下,它们由管理员创建、下载、导出并分发给团队成员 。
3.1签名说明IOS签名调用codesign指令,也可以直接使用相关指令进行签名 。以下是协同设计的常见说明:
# MAC终端输入: codesign --helpcodesign --helpUsage: codesign -s identity [-fv*] [-o flags] [-r reqs] [-i ident] path ... # sign codesign -v [-v*] [-R=
- 斑鸠别名,斑鸠是什么鸟
- 正宗的山西老陈醋是什么牌子,山西老陈醋哪个品牌正宗又便宜
- 什么时候种百合种球最合适 什么时候种百合
- 牡丹花啥时候种最好 牡丹花什么时候种最好
- 丰田属于什么档次的 丰田是哪个国家的
- 春天夏天秋天冬天的代表景物 春天夏天秋天冬天的代表景物是什么
- 红酒倒进杯子为什么会有泡沫
- 梦到大蜘蛛 梦见大蜘蛛是什么意思
- 辽宁地区什么时候种向日葵 什么时候种向日葵
- 丞相是什么意思 丞相简单介绍
