iOS证书签名原理分析过程
  • 作者:苹果ios企业超级签名
  • 发表时间:2022-04-11
iOS签名原理
在苹果真机调试与发布在线时,大众已经习惯各种配置证书、描述文件、其他繁琐程序。可是,大众之前还没有解析和研究为何要在背后配置这些,今天小编就来做一个简单的介绍!
一、背景
我们都知道苹果手机的正版APP只能去App Store下载其他系统的手机,如安卓手机APP现在有很多方法,这些软件不需要签名。苹果控制每个安装在苹果手机上的软件APP都是经过苹果官方认证的,于是就采用了签名机制。
1.对称加密
对称加密是密码学中一种加密算法的总称。这种算法在加密和解密时使用相同的密钥,或两个可以简单地相互计算的密钥。常见的对称加密算法包括DES、3DES、AES、RC5等等。与非对称加密算法相比,对称加密算法具有加解密速度快的优点。
2.非对称加密
非对称加密是指加密钥和解密钥成对出现,其中一个是公开的,称为公钥,另一个是私钥,几乎不能从一个密钥中计算出另一个密钥。私钥加密只能通过公钥解密,公钥加密只能通过私钥解密。最著名的非对称加密算法是RSA算法。当然,在牺牲加密速度的基础上获得如此强大可靠的安全性。
通常,我们所说的签名是基于非对称加密算法的数字签名。对称加密是通过同一密钥加密和解密数据,而非对称加密有两个密钥,即公钥和私钥。用公钥加密的数据只能用私钥解密;用私钥加密的数据只能用公钥解密。这里的非对称加密是众所周知的RSA,要了解RSA背后的数学原理可以参考RSA算法原理(1)(2)
二、从App Store安装APP
这个过程的签名方式比较简单。苹果官员生成一对公共和私钥,在苹果手机中内置一个公钥。私钥保存在苹果后台,我们传递App上AppStore当苹果后台用私钥对齐时,App数据值的MD5值签名,iOS下载此系统App之后,用公钥验证签名。如果签名正确,这个App苹果的后台必须认证,没有修改,这满足了苹果的需求:确保每个安装App苹果认证允许。
三、安装安装方式APP
在实际工作中,我们还有一些其他的方法APP安装在手机上:
开发App可直接将开发中的应用安装到手机调试中;
In-House企业内部分发,企业证书签字后可直接安装App;
AD-Hoc相当于企业分发的限制版,限制安装设备数量,使用较少。
苹果对这些安装方法的控制过程变得复杂,即确保APP苹果认证的安装应控制APP苹果不能随意安装在其他设备和其他一些权限上。为了达到这个目的,苹果的流程大致是这样的
基本流程:
1、在Mac在这里生成一对公钥,称为公钥M,私钥M。
2、苹果自己有一对固定的公共和私人钥匙,跟上AppStore例如,私钥在苹果的后台,每个公钥都内置iOS在设备上,它被称为公钥A,私钥A。
3、把公钥M用苹果后台的私钥上传到苹果后台A去签名公钥M。获得的数据包含公钥M及其签名(即公钥)HASH值),称这个数据为证书。
4、在开发时,编译完一个App之后,使用本地私钥M对这个App签名时,将第三步获得的证书打包在一起App安装在手机上。
5、在安装时,iOS系统通过系统内置的公钥获得证书A,验证证书的数字签名是否正确。
验证证书确保公钥M苹果已经认证,然后使用公钥M去验证App这里间接验证了签名App苹果是否正式允许安装。(这里只验证安装行为,不验证App是否因为开发阶段而改变?App内容总是在变化,苹果不需要管理)。
最终流程:
上述过程只解决了上述第一个需求,即苹果允许安装,第二个避免滥用的问题尚未解决。如何解决它?苹果增加了两个限制,一个是在苹果后台注册的设备;另一个是限制签名只能针对特定的签名App。
那么,它是如何增加这两个限制的呢?在上述第三步中,苹果使用私钥A签署本地公钥M事实上,除了签署当地的公钥M此外,还可以添加无限多数据,可以保证苹果官方认证,不会被篡改。
允许安装的设备可以使用ID列表和App对应的AppID所有的数据这里有公钥等数据M一起组成证书,再用苹果私钥A签署此证书。验证最后第五步时可获得设备ID列表,判断当前设备是否符合要求。根据数字签名的原则,只要数字签名通过验证,这里的设备步骤5IDs/AppID/公钥M苹果认证,不能修改,苹果可以限制可安装的设备和APP,避免滥用。
这个证书已经变得非常复杂,有很多额外的信息,除了设备ID/AppID,这里还需要用苹果签名其他信息,比如App里iCloud、push、苹果想控制后台运行 等权限,苹果统称这些权限开关Entitlements,还需要签名授权。
事实上,一个证书已经有了规定的格式规范。我们不适合在证书添加各种额外信息,所以苹果做了另一件事叫做Provisioning Profile,一个Provisioning Profile它包含上述证书和所有额外信息,以及所有信息的签名。
所以,就是这样:
在 Mac 在这里生成一对公钥,称为公钥M,私钥M。
苹果有一对固定的公共和私人钥匙,上面 AppStore 例如,私钥在苹果的后台,公钥在每个iOS设备上。这里称为公钥A,私钥A。A:Apple
把公钥M用苹果后台的私钥传到苹果后台A去签名公钥M。获得的数据包含公钥M以及它的签名,称这个数据为证书。
在苹果后台申请AppID,配置好设备ID列表和APP可用权限,加上第三步证书,由私钥组成的数据A签名,数据和签名一起组成Provisioning Profile将文件下载到本地Mac开发机。
在开发过程中,编译一个APP之后,使用本地私钥M对这个APP签名,同时获得第四步Provisioning Profile文件打包进APP文件叫 embedded.mobileprovision,把APP安装在手机上。
在安装时,iOS系统通过系统内置的公钥获得证书A,去验证 embedded.mobileprovision数字签名是否正确,证书签名将再次检查。
确保了embedded.mobileprovision苹果授权后,可以取出里面的数据进行各种验证,包括使用公钥M验证APP签字,验证设备ID是否在ID列表上,AppID权限开关是否对应APP里的Entitlements对应等。
开发者证书从签名到认证最终苹果采用的流程大致是这样,还有一些细节像证书有效期/证书类型等就不细说了。
上述步骤对应于我们通常的具体操作和概念:
第一步对应keychain从证书颁发机构申请证书,当地生成了一对保存的公私钥CertificateSigningRequest就是公钥,私钥保存在本地电脑里。
第二步苹果自己处理,我们不用担心。
第3步对应把CertificateSigningRequest将证书发送到苹果后台生成并下载到本地。此时,本地有两个证书,一个是第一步生成的,另一个是从这里下载的,keychain由于它们的公私钥对应,这两个证书将被关联起来Xcode当你选择下载的证书时,你实际上会找到它keychain里面对应的私钥签名。这里的私钥只生成这个Mac只有,如果别的话Mac还要编译签名App,将私钥导出给其他人Mac使用,在keychain私钥在里面导出,会存成.p12文件,其他Mac打开后导入私钥。
第4步都是在苹果网站上操作,配置AppID、权限、设备等,最后下载 Provisioning Profile文件。
第5步Xcode通过第三步下载的证书(存储本地公钥),在本地找到相应的私钥(生成第一步),用本地私钥签名App,并把Provisioning Profile文件命名为embedded.mobileprovision一起打包。这是对的。App签名数据保存分为两部分,Mach-O可执行文件将签名直接写入本文件,其他资源文件将保存_CodeSignature目录下。
第六步和第七步的包装和验证是 Xcode 和 iOS 系统自动做的事情。
四、总结
几个概念:
证书:由其他机构签名的公钥或私钥组成的数据包。
Entitlements:包含了App权限开关列表。
CertificateSigningRequest:本地公钥。
.p12:本地私钥可以导入其他电脑。
Provisioning Profile: 证书/包括 证书/Entitlements 等数据,以及由苹果后台私钥签名的数据包。
其它发布方式
以开发包为例,说了签名和验证的过程,还有两种方式In-House企业签名和AD-Hoc流程也差不多,但是企业签名不限制安装的设备数量,用户需要iOS只有在系统设置上手动点击信任,企业才能通过验证。
而AppStore签名验证方法有些不同。我们前面说过最简单的签名方法。苹果直接在后台用私钥签名App没关系。事实上,苹果确实这样做了。如果你下载一个AppStore安装包,会发现里面没有embedded.mobileprovision文件的安装和启动过程不依赖于文件,验证过程与上述类型不同。
因为上传到AppStore苹果将重新加密内容,原本地私钥签名无用,需要重新签名,从AppStore下载的苹果不打算控制它的有效期,也不需要内置一个embedded.mobileprovision去做验证,直接用苹果后台的私钥重新签名,iOS安装时使用本地公钥验证App签名就够了。
那为什么发布AppStore包还是要像开发版一样做各种证书Provisioning Profile,因为苹果想做统一管理,Provisioning Profile它包含一些权限控制,AppID 测试等,苹果不想上传AppStore 包装时,最好将这部分统一放在 Provisioning Profile里,上传AppStore用同样的流程验证这个 Provisioning Profile是否合法。
所以 App 上传到AppStore之后,你的 证书 / Provisioning Profile 没关系,不管是过期还是废除,都不会影响AppStore 安装包。
以上是对整个签名的一般分析。
iOS简化签名流程
第一步:从KeyChain生成 CertificateSigningRequest.certSigningRequest。
获取 本地文件CertificateSigningRequest.certSigningRequest包含用户信息,公钥。
得到 Access|Keys中一对Public/Private Key ,公钥/私钥。
第二步申请证书:
通过CSR文件的公钥生成证书,包含开发者信息,公钥信息,使用苹果私钥加密。下载到本地使用苹果公钥解密,得到KeyChain证书文件中,
第三步 申请授权描述文件:
苹果私钥加密包括AppId,信息,如证书、功能授权列表、设备列表等。
第四步 App打包生成:
私钥签名
第五步 App安装验证:
设备使用CA证书(WWDRCA.cer)的公钥解密Provisioning Profile得到app 公钥和app摘要,验证Provisioning Profile的合法性。
使用app公钥解密app来判断App合法性,使用app摘要判断内容app是否被篡改。
重签名
解释重签名:
当在Xcode进行archive或者用脚本打包ipa当时,通常到最后一步,有一个签名过程,在签名中发挥关键作用的是配置证书和描述文件。也就是说,一套证书,描述文件最终签署相应的ipa。
所谓重签名的概念是,一个现有的概念可以存在ipa重新配置一套证书和描述文件,然后签名生成新的ipa包。
ios重新签名的核心原则是使用 codesign 命令,当然可以完成一些额外的操作。
大致流程
1、解压ipa
2、删除旧的签名
3、 ** 新的描述文件
4、用新的证书签名
5、压缩成ipa
在这个过程中,最重要是这个 entitlements.plist文件的问题。
entitlements.plist是一个比较重要的文件,涉及到app的权限及签名相关问题。
那么,如何得到这个文件呢?我们可以通过这条命令
获取到这个文件的内容,大致格式如下:
注意:这里我们我么需要把红色的地方替换成新的签名文件的bundleid和teamid.
当然,有的朋友可能会问,有没有更简单的操作呢?
实际上是有的。
著名的自动化工具fastlane,就封装了一个resign的工具,专门可以用来对app进行重签名的。
使用方法也很简单, 一行命令即可。

以上就是关于 tf签名 -对于如何打包IOS的IPA文件 TF 免签 超级签名 如果需要了解更详细(http://www.yuanqilanguage.com)的知识请联系在线客服!