iOS签名
iOS开发时真机测试、AdHoc、应用上架,我们都需要先到官网下载证书。这一过程其实就是iOS签名机制。这一过程保证了每一个安装到iOS平台的应用都是苹果允许的。
数字签名
数字签名主要是根据非对称算法实现的,对称加密是通过同一份密钥加密和解密数据,而非对称加密则有两份密钥,分别是公钥和私钥,用公钥加密的数据,要用私钥才能解密,用私钥加密的数据,要用公钥才能解密。
数字签名作用是当我对数据打了一个标记,表示我认可了这份数据(签了个名),然后我发送给其他人,其他人可以知道这份数据是经过我认证的,数据没有被篡改过。
- 首先用一种算法计算出原始数据的摘要。摘要一般满足a.原始数据变化,摘要也要变化。b.摘要要足够短。一般使用MD5算法。
- 生成一份非对称加密的公钥私钥,私钥自己拿着,公钥发布出去。
- 用私钥将摘要进行加密,作为原始数据的签名。将原始数据和签名一起发送给客户。
- 用户收到数据后,将签名通过公钥解密得到摘要。数据通过同样算法加密得到摘要,判断摘要是否相等,来确定数据是否被篡改。
iOS 签名
最简单的签名
最简单的签名方式为,苹果生成公钥和私钥,私钥放到苹果后台,iOS内置公钥。App上传到App Store时,苹果后台用私钥对App进行数字签名,iOS设备下载App时,用公钥验证签名,如果App是通过苹果后台认证的则安装。
但是实际上除了App Store安装app,我们还可以通过3种方式安装:
- 开发 App 时可以直接把开发中的应用安装进手机进行调试。
- In-House 企业内部分发,可以直接安装企业证书签名后的 APP。
- AD-Hoc 相当于企业分发的限制版,限制安装设备数量,较少用。
苹果要对这三种方式安装的App进行控制,上面的方式就无法实现了。
开发App时应用安装 签名流程
- Mac电脑上生成一对公钥私钥,这里称为公钥L、私钥L
- 苹果固有的一对公钥私钥,iOS设备内置公钥A,苹果后台保存私钥A
- 公钥L上传到Apple后台,通过苹果后台私钥A对其进行签名,得到一份数据包含公钥L和它的签名,称为证书
- 在Apple后台申请AppID、设备ID、App使用权限,和3的证书一起,通过私钥A签名,将数据和签名组成Provisioning Profile(描述文件),下载到mac。
- 开发时编译完App,会通过本地的私钥L对App进行签名,同时把描述文件打包放到App中,文件名为 embedded.mobileprovision,把 App 安装到手机上。
- 安装时,iOS系统取到证书,通过内置的公钥A,验证embedde zded.mobileprovisions的数字签名是否正确。
- 确保了数据是苹果授权,取出里面的数据,验证App签名、设备ID是否在列表上,AppID是否对应,权限开关是否对应。
对应操作
- 第1步对应就是从keychain中“从证书颁发机构请求证书”,生成了本地的公钥私钥,保存的CertificateSigningRequest是公钥,私钥保存在电脑本地。
- 第2步是苹果自己处理的
- 第3步对应是将CertificateSigningRequest上传到苹果后台生成证书,并下载到本地。
此时本地有两个证书,一个是第1步生成包含私钥的证书,另一个是刚下载的证书,keychain将两个证书关联起来,因为他们公钥和私钥是对应的。从Xcode中选择证书是,实际上是通过keychain里对应的私钥去签名。这个私钥只有生成它的Mac中有,如果其他Mac也想要编译签名这个App的话,可以把私钥导出给其他Mac用,从keychain导出.p12文件,其他Mac打开就导入了这个私钥。
- 第4步,在苹果官网上操作,配置AppID/权限/设备等,最后下载描述文件
- 第5步Xcode通过第3步下载回来的证书(公钥),在本地找到对应的私钥,用本地的私钥签名App,并把描述文件命名为embedded.mobileprovision一起打包进去。这里对App的签名数据保存分2部分,Mach-O会把签名直接写到文件中,其他资源文件则会保存在 _CodeSignature 目录下。
- 6-7步是系统做的事
- 证书:公钥L和签名
- Entitlements:App权限
- CertificateSigningRequest:本地公钥L
- p12:本地私钥,可导入其他电脑
- Provisioning Profile:包含了证书、 Entitlements等数据,苹果后台私钥签名的数据包
App Store
App发布到App Store的签名验证方式和上述不同,最简单的签名方式就可以满足。事实上下载一个App Store的安装包,里面不包含embedded.mobileprovision文件的,它并不依赖这个文件。
上传到App Store的包苹果会重新对内容加密,原来本地的私钥签名就没用了。AppStore下载的包,苹果也不打算控制它的有限期,所以直接在苹果后台的私钥签名,iOS设备中公钥验证就可以了。
为什么还要一样弄证书和描述文件呢?猜测因为想统一管理,描述文件中包含一个权限控制,AppID校验。苹果不想上传是重新用另一种协议验证,不如统一放到描述文件中,上传到App Store时只要用同样流程验证描述文件是否合法即可。
所以App上传到App Store后,和证书、描述文件无关,他们不会影响已经上线的App。
网友评论