iOS签名机制

iOS签名机制

概要

背景

在iOS开发中,配置证书总是一件繁琐的工作,网上的教程有很多,基本都是手把手的教操作,但是如果不了解为什么要配置这些东西,对配置流程就不会有深刻的印象。

配置证书最大的作用就是保证安全性,安全性主要表现在以下的几个方面:

1.保证苹果手机下载的App是从苹果官网认证的途径下载

2.保证App在苹果官方注册过的设备上运行

3.保证App在特定的设备中运行(开发需要)

技术支持

苹果采用的是数字签名进行加密,它是基于非对称加密算法和摘要算法实现的,和对称加密算法不同的是对称加密通过同一份密钥加密和解密数据,而非对称加密有两个密钥,分别是公钥和私钥,用公钥加密的数据,要用私钥才能解密;用私钥加密的数据,要用公钥才能解密。这里的非对称加密就是我们熟知的RSA,想要深入理解的童鞋可以自主了解。

为了更好的理解非对称加密的好处,我举一个场景例子:A要发送邮件给B,这个过程中要确保在传输中邮件内容没有被篡改,也就是只有B可以查看邮件的内容;还要确保这个邮件是A发送过来的,不是其他人发送的。我们用非对称加密的方式来处理:首先存A和B各有一对公私钥,A持有他自己的私钥和B的公钥,B持有A的公钥和B的私钥,公钥一般是给别人的,私钥在自己手里。A先用B的公钥给邮件加密,这样这个邮件只能被B的私钥解开,保证在传输过程中不会被篡改;A用自己的私钥将邮件加密,B要用A的公钥将邮件解密,来确保这是A发送过来的。这就是双向验证。

基于iOS开发的签名机制

从App Store安装App

这个签名的方式相对简单,只需要验证App是从AppStore上下载的即可。苹果官方生成一对公私钥,在苹果设备上内置一个公钥,私钥由后台保管,我们上传App到AppStore时,苹果后台用私钥对App进行签名,设备在在App包后,用内置公钥验证签名。

思考:每个设备和苹果后台都有对应的一对公私钥还是只有一对公私钥,每个设备的公钥都是一样的,如果是前者,给App用私钥加密的时候是什么时候?

结论:所有苹果设备上的公钥都是一样的。

其他方式安装App

  • 通过Xcode将App运行在设备上,调试用
  • 企业内部分发,可以直接安装企业证书签名后的App
  • AD-Hoc相当于企业分发的限制版,限制安装设备数量

以上几种场景就比较复杂了,我们需要确保这个App包的来源是苹果官方认证的,还要指定设备信息(不能随便的苹果设备都可以运行)。在了解这些场景的签名过程之前我们先思考一些问题:

1.App包不能上传到App Store上进行私钥加密了,需要通过其他介质间接验证;

2.iPhone上只有一个公钥可用,如何验证这么多信息;

3.如何限制设备、权限等额外信息。

我们需要除了App包以外的信息来进行验证,就是各种加密之后的文件,所以我们需要配置很多的证书。

加密流程

1.在mac上生成一对公私钥,公钥M,私钥M,苹果后台和苹果设备有一对公私钥,公钥A,私钥A。

2.将公钥M上传到苹果后台,用苹果后台的私钥A签名公钥M得到了公钥M的签名,代称hashM(私A),hashM(私A)和公钥M组成的数据称为证书。(证书携带苹果官方认证信息,需要和App到达设备上)

3.开发完成后,用私钥M对App进行签名,同时将证书一起打包进App中,安装到手机。

4.安装时,iOS系统获得证书,用公钥A验证hashM(私A),得到的信息和证书中的公钥是否一致。

以上的流程可以完成验证App是否经过了苹果官方认可的需求,没有解决滥用的问题。这里的滥用问题包括任何App都可以用这个证书在任何设备上安装运行,这是不允许的。我们可以把这些限制信息如AppID、设备ID等和证书再用私钥A进行加密,在最后的iOS系统验证的时候就可以判断这些限制数据是否符合要求。可以理解为又进行了一次加密。得到的数据就是我们知道的Provisioning file,Provisioning file里面就包含了证书和以上提到的额外信息,以及所有信息的签名。

在编译一个App后,用本地的的私钥M对这个App进行签名,同时把Provisioning file文件打包到App中,文件名为embeded.mobileprovision,把App安装到手机上。以上的过程就是加密的过程,看起来加密了很多层,让我们来梳理一下:

配置证书简要流程

请求根证书

在mac上生成一对公私钥,并将公钥上传到苹果后台,用苹果后台的私钥加密mac公钥,得到证书

CSR生成一对公私钥,私钥始终在Mac OS的Keychain Access中,用于签名(CodeSign)对外发布的App,公钥一般随着证书(随Provisioning Profile,随App)散布出去,对App签名进行校验认证。用户要保护好本地Keychain中的private key。

创建CSR文件:打开钥匙串->证书助理->从证书颁发机构请求证书。注:CRS文件是Cerificate Signing Request的英文缩写,即证书请求文件,CerificateSigningRequest就是本地公钥,.p12就是本地私钥,可以导入其他电脑,同时其他电脑也应该安装下载下来的证书。所以这一步团队开发人员很少操作。

添加设备

苹果严格限制了真机调试的设备,如果需要真机调试需要在开发者后台添加测试机的UDID

新增描述文件

描述文件(Provisioning Profile)是一个记录了你这个App的功能和权限的证书。

一般会用到以下三种:

develop:调试证书,包含调试信息,安装时需要证书已加入设备UDID或者越狱设备才能安装。

distribution:正式证书,屏蔽了调试信息,发布到AppStore所用。

ad-hoc:测试证书,需要给别人测试用到,允许用户从第三方下载应用,如蒲公英。

刷新证书及描述文件

一般在重新请求根证书之后需要更新所有的描述文件内的根证书配置。

根证书和证书对应的私钥都需要有人进行维护(或者使用fastlane维护),在团队新增成员、设备时需发放到对应的机器中的钥匙串内,否则无法进行构建和上传IPA。

描述文件更新后需要在Xcode的User设置中找到开发者刷新一下Profile,或者到Profile的保存文件夹内清空重新下载,以避免描述文件更新不及时问题导致CI/CD构建失败。


iOS签名机制
https://zcx.info/2022/01/05/iOS签名机制/
作者
zcx
发布于
2022年1月5日
许可协议