2018 November 30 iOS的签名机制
iOS的签名机制(二)
iOS的签名机制
- iOS签名机制的作用
- 保证安装到用户手机上的APP都是经过Apple官方允许的
- 不管是真机调试,还是发布APP,开发者都需要经过一系列复杂的步骤
- 生成CertificateSigningRequest.certSigningRequest文件
- 获得ios_development.cer\ios_distribution.cer证书文件
- 注册device、添加App ID
- 获得*.mobileprovision文件
- 对于真机调试,现在的Xcode已经自动帮开发者做了以上操作
- 思考
- 每一步的作用是什么?
- .certSigningRequest、.cer、.mobileprovision文件究竟里面包含了什么?有何用处?
iOS签名机制 – 流程图

- 3个角色
- MAC设备
- 这个MAC设备要生成这个MAC的一对公钥、私钥
- 即MAC要有他自己的公钥、私钥
- 苹果的后台服务器
- 苹果官方(后台)也生成自己的一对公钥、私钥
- 私钥保存在苹果自己的服务器
- 公钥在每一台苹果的iOS设备上
- 即每一台iOS设备都有一个相同的苹果后台的公钥
- iOS设备
- 保存这苹果后台的公钥
- 用户开发出APP
- 包中主要包含苹果的源代码Mach-o文件、图片、视频、nib、sb等
- 用户从开发出APP 到生成可上架的ipa流程(这里就把ipa包看做一个箱子,将要用来装下面的的东西)
- 我们开发的APP源码通过MAC本机的私钥签名,然后放入到ipa包中。生成物如下:
- APP源码包
- 签名(APP源码包的散列值通过MAC私钥加密后的值)
- 将MAC公钥生成证书:
- 将MAC的公钥也要放到ipa包中,否则无法验签
- 我们知道公钥的传递为了防止中间人攻击,采用证书来传递
- 证书的生成需要由CA来生成,其实就是通过CA的私钥来签名
- 这里苹果后台就是CA了
- 苹果后台CA给MAC公钥签名,获得证书,证书内容包含以下东西:
- MAC公钥
- 签名
- 生成mobileprobision文件
- 由第2步骤生成的证书,在加上devices、APP id、entitlements(APP的权限,比如推送等)等信息,通过苹果后台CA(即苹果后台私钥)再次加签,生成mobileprovision文件
- 将生成的文件放入到ipa包中
- 总结,上面所有的过程都是通过Xcode打包生成ipa来完成的
- 我们可以直接解压ipa包,就可以看见这些文件
- 上面这些东西的作用是什么呢?下面来看,ipa安装到手机上的操作
- 苹果手机上拥有苹果官方后台的公钥,通过这个公钥验证ipa包中的mobileprobision文件中的签名
- 说明当前的mobileprobision内容没有被串改
- 拿到证书,为了拿到MAC公钥
- 拿到devices,用于判断这台机器是否可以安装(哪些设备可以安装)
- 拿到APPid ,用于判断这个APP包是否是这个id(可以安装哪个APP)
- 拿到entitlements,用于判断这个APP包是否包含这些权限(内购、推送)
- 验证成功后,再次通过苹果官方的公钥来验证证书中的签名
- 验证成功,说明MAC的公钥是没有问题的,此时拿到MAC的公钥
- 通过MAC的公钥,来验证APP的签名
- 验证是否APP被串改
- 验证成功,说明代码没有被串改,安装APP
- 缕清思路
- APP加签,保证APP没有被串改
- MAC公钥加签生成证书,苹果充当CA(认证机构),保证你的MAC公钥是合法的,真正的
- 证书+APP信息加签,苹果保证你的APP是否可以正常安装。
流程步骤实操
- 生成Mac设备的公私钥
- 这个过程生成CertificateSigningRequest.certSigningRequest文件
- 就是Mac设备的公钥
- 获得证书
- 这个过程生成ios_development.cer、ios_distribution.cer文件
- 利用Apple后台的私钥,对Mac设备的公钥进行签名后的证书文件
- 生成mobileprovision

- 安全检测

- AppStore
- 如果APP是从AppStore下载安装的,你会发现里面是没有mobileprovision文件的
- 我们将ipa上传到App Store,苹果后台会对我们的APP进行重新签名
- 相当于我们从App Store重新下载的ipa,是苹果的私钥直接签名的,不包含MAC私钥签名那个流程了。
- 因此下载到手机上后,直接通过手机上的苹果官方公钥验签就可以了
- 它的验证流程会简单很多,大概如下所示

文件总结
- .certSigningRequest文件
- Mac公钥
- .cer文件
- 利用Apple的私钥(CA),对Mac公钥生成了数字签名
- .mobileprovision
- 利用Apple私钥,对【.cer证书+devices+AppID+entitlements】进行数字签名。
知识点总结
- 加密解密算法
- 对称加密
- 加密解密用的是同一个秘钥
- 加密解密速度快
- 无法解决秘钥配送问题
- 公钥密码
- 加密解密用的是不同秘钥
- 公钥加密,私钥解密
- 私钥加密,公钥解密
- 加密解密速度慢
- 解决秘钥配送问题
- 单向散列函数
- 根据消息生成对应的固定长度的散列值
- 防止数据被篡改
- 数字签名
- 用私钥加密消息散列值,生成的密文
- 证书
- 用CA的私钥,对其他人的公钥生成数字签名