引言
每开发完一个App,正规的途径想让大家都可以下载这个App,我们需要上架在AppStore,会不会想到一个问题,AppStore是怎么知道我们的App是不是正规的,也就是说怎么知道从AppStore中下载的?
根据上面的问题,研究一番以后
Apple的好处是:
- 所有的App如果想让所有的用户下载,必须通过AppStore
- 所有的IPhone都是Apple一家制造
- 硬件、服务、设计一家所有
综合上述条件Apple公司可以实现验证App的目的,如果只验证App是否合法,Apple公司可以这么搞:
需要的准备
- 自己生成私钥、公钥(私钥生成公钥)
- 将私钥放到AppStore(AppleServer)
- 所有的IPhone生产时都放入公钥
验证步骤
- 先上架开发完成App到AppStore
- AppStore用自己的私钥对App签名(也就是对App标示的hash值进行私钥加密)
- IPhone安装App时,用IPhone中的公钥对App解密,然后验证App标示
-
验证通过?安装:不安装
如果开发者也是这个过程那么,开发者的开发时间成本也就太大了。
开发者调试App验证
需要的准备
- 用Mac电脑的钥匙串,生成私钥A、公钥A(Mac钥匙串中请求证书生成的CSR文件CertificateSigningRequest.certSigningRequest)
- AppServer中本身存在自己的私钥B
- 所有的IPhone都会放入Appstore中私钥生成的公钥B
步骤
- 用Mac电脑的CSR文件(也就是公钥)向AppleServer申请证书
- AppleServer生成一个证书Z,包含对1中的公钥进行加密(用ApplerServer的私钥B加密)的hash值,以及公钥A, 返回给本地电脑
- 我们安装的App不单单只有一个可执行文件,包含了:公钥A加密App的hash值的签名D、从AppleServer生成的证书,当然还有别的本文讲不到
- 一个正常的可安装的App包含的内容:
- 可执行文件
- 公钥A对App的hash值的签名D(加密)
- AppleServer生成的证书Z
- 一个正常的可安装的App包含的内容:
- 手机取出App的证书Z,用公钥B对这个证书Z进行解密拿到公钥A,以及App的hash值 然后验证这个证书是否合法
- 用公钥A解密签名D拿到App的hash值,进行验证是否合法
- 通过4,5双重验证推送证明该App合法,可以正常调试、安装了
问题?
当然你可以在上述基础上面验证App的合法性,但是有问题,我只要申请一个证书,我就可以在任何的IPhone上面安装这个App,这样没有达到完成控制的目的,Apple肯定不乐意,理所应当的又弄了一个权限文件,也就是大家熟悉的描述文件provisionprofile文件
描述文件也是通过签名认证的所以也无法修改,so只能去AppleServer申请。
- 当用户申请证书以后,打包App进行安装的时候Xcode会帮助我们生成一个描述文件,这个描述文件就是我们App的第二阶段的限制包含:
- 限制你的设备数量
- 只能签名一个App
- App的权限:推送、定位。。。等等
通过以上provisionprofile来控制App的安装
步骤就会变成酱紫
- 用Mac电脑的CSR文件(也就是公钥)向AppleServer申请证书
- AppleServer生成一个证书Z,包含对1中的公钥进行加密(用ApplerServer的私钥B加密)的hash值,以及公钥A, 返回给本地电脑
- 我们安装的App不单单只有一个可执行文件,包含了:公钥A加密App的hash值的签名D、从AppleServer生成的证书,当然还有别的本文讲不到
- 一个正常的可安装的App包含的内容:
- 可执行文件
- 公钥A对App的hash值的签名D(加密)
- AppleServer生成的证书Z
- 一个正常的可安装的App包含的内容:
- Xcode拿到证书Z以及Mac本地的私钥对App进行签名
- 将证书Z、描述文件、签名D、MachO文件一起打包到手机
- 手机取出App的证书Z,用公钥B对这个证书Z进行解密拿到公钥A,以及App的hash值 然后验证这个证书是否合法
- 用公钥A解密签名D拿到App的hash值,进行验证是否合法
-
通过4,5双重验证推送证明该App合法,可以正常调试、安装了
验证结果
- 查看是否打包在App包里面有描述文件
- 建一个项目
- 设置好证书
- 编译代码
- 打开App包
-
查看证书,签名信息
1.包里面
2.MachO可执行包里面
网友评论