最近在研究除了 Apple 官方途径,iPhone手机上安装应用的其他途径。顺便总结下 iOS 开发中涉及的一套证书及签名机制。

数字签名

数字签名是非对称加密和摘要算法的结合。防止中途篡改文本内容,保证文本的完整性,以及文本是由指定的权限者发的。
发布方加密过程:

接收方验证过程:

数字证书

数字证书就是通过数字签名实现的数字化的证书。简单讲数字证书包含以下信息:

  • 签发机构:CA(苹果公司)
  • 被签发人:企业 / 开发者
  • 验证方:iOS 设备
  • 验证过程:固化在 iOS 系统中
  • 证书链:根是苹果的CA

iOS 开发:证书申请、签名打包


这张图阐述了,开发iOS应用程序时,从申请证书,到打包的大致过程。简单总结如下:

数字证书的作用:
证明app的所属以及app的完整性,保证app本身是安全的。

iOS授权和描述文件

mobileprovision是为了证明 app 所使用的某些服务是被苹果认可的,如 Push 证书。
mobileprovision包含:

  • AppId。
  • 使用哪些证书。
  • 功能授权列表。
  • 可安装的设备列表(UDID)。
  • 苹果签名。

.ipa文件


.iTunesMetadata.plist文件用来记录app的基本信息,例如购买者的appleID,app购买时间、app支持的设备体系结构,app的版本、app标识符等。
解压/payload中的.app文件可看到.ipa主要的文件结构:

  • _CodeSignature/CodeResources:程序包中(除 Frameworks)所有文件的签名。
  • embedded.mobileprovision:打包时使用。
  • SC_Info(图中未列出):包含两个文件
    1. appname.sinf 为 metadata 文件
    2. appname.supp 为解密可执行文件的密钥


Xcode 打包生成 ipa 文件过程中利用当前证书私钥进行代码、资源文件的数字签名,将其存放在_CodeSignature文件夹下。

关于 iTunes 授权

每个 Apple ID 最多授权5台电脑(用来登录iTunes下载app和管理同步手机)。5的限制是通过扫描硬盘序列号来确认。
iTunes 授权时,需要连接 Apple 服务器进行验证,通过验证后,会将授权信息以加密文件的形式,存放在SC_Info文件夹。这些文件是隐藏的,可通过TinkerTool查看。

iTunes 授权后,即可登录 Apple ID 并将该账号下购买过的应用同步到 iPhone 中。XX 助手工具便通过“欺骗授权”的方式,为每个用户修改或虚拟出一个相同的硬盘序列号,接着,“这台电脑”取得一个公共 id 的授权,然后把公共id买过的 app 装到某 iOS 设备中。达到一个账号给多台设备(5台以上)共享使用的目的。

账号共享分发

这篇文章讲到在 windows 平台下使用账号共享分发app的方法。简单总结如下:

同步授权后可以使用iTunes,也可以使用itools安装分享者另外发布出来的所有应用。

ipa 文件安装后的校验过程

App安装到ios系统上时,系统首先通过描述文件找到数字证书,通过证书里的苹果数字签名,验证证书的有效性。如果证书有效,取出证书中的开发者公钥,解密App的数字签名。如果发现摘要一致,则验证通过,App成功安装在手机上,其中一个环节有问题,验证工作就失败。

漫谈iOS程序的证书和签名机制
iTools第三方市场分发原理
代码签名探析
签过名的ipa文件
多个授权文件共存的正确方法