iOS app签名原理

基本原理:

公钥能够验证私钥的签名是否正确。

Apple后台有一个私钥A,iOS内置一个公钥A,与私钥A对应。(A:代表Apple,即苹果)

本地产生一对公钥L私钥L(L:代表Local,即本地),私钥L保存在本地公钥L(也就是.certSigningRequest文件)传到apple后台签名后生成证书可下载至本地证书的作用是可以验证私钥的签名,另外XCode在给app签名时也会通过证书找到对应的私钥,一个证书对应一个私钥(因为一个证书就是一个公钥,只能对应一个私钥)。

ps:开发中,公钥对应从开发者网站上下的certificate文件,私钥对应.p12文件

 

Provision Profile

描述文件,其中包含证书,及app的相关信息(如entitlements,bundle id,支持的device id列表之类的,这里只讨论跟签名相关的内容),app打包时会内嵌一个embedded.mobileprovison文件,这个文件会被apple用私钥A签名。

 

所以一个app被装到iPhone上的验证步骤如下:

iOS先通过内置的公钥A来验证embedded.mobileprovison文件的正确性,验证通过后从embedded.mobileprovison文件中取出公钥L(也就是证书certificate),来验证app是否被私钥L签名,当然一个embedded.mobileprovison文件中可能包含多个证书,推测此时的验证逻辑为,app只要被其中一个证书验证通过(即只要被一个其中一个证书对应的私钥签名),就认为app签名正确,另外安装时系统还会同步验证embedded.mobileprovison里的其他信息,如entitlement文件,基本原理就是验证app签名后的entitlement权限内容是否与embedded.mobileprovison里包含的entitlement文件一致(当然其中包括bundle id的验证,只不过这里只验证entitlement权限内容中的bundle id,而不去验证info.plist文件中的bundle id,iOS app签名时会包含entitlement文件内容,即签名时可以指定此app支持哪些权限),所以我们在重签名app的时候需要重新指定entitlement权限,使其与embeded.mobileprovison文件中的entitlement文件内容一致。

 

开发中常遇到的问题:(一般在手动签名的过程中可能会遇到)

一般来说开发中的embedded.mobileprovision文件都是从开发者网站上下载的,所以这个文件的正确性一般来说都是没问题的,所以如果一个app不能被装到iPhone上,一个可能的原因就是签名这个app的私钥所对应的证书(certificate,即公钥)没有在描述文件中,此时的解决办法就是重新生成描述文件,让其包含对应的证书(certificate)。另外跟签名相关的原因可能是证书(certificate)过期(意味着公钥过期,因为私钥是与之一一对应的,所以私钥也过期了,需要重新生成)。

另外一个常见的原因就是app签名后的entitlement权限内容与embeded.mobileprovision文件中的entitlement内容不一致,此时需要修改app签名时的entitlement权限内容,codesign --entitlements参数就是在签名的时候指定app支持哪些权限(ps:查看app重签名之前支持哪些权限可通过命令 codesign -d --entitlements :- Payload/GradleTest.app)。

 

例:

codesign -f -s "iPhone Distribution: ABC Information Technology Co., Ltd." --entitlements Entitlements.plist Payload/$1.app

猜你喜欢

转载自www.cnblogs.com/yibinpan/p/8856230.html