文章结构
文章结构.png
iOS签名机制的作用
- 保证安装到用户手机上的APP都是经过Apple官方允许的
- 不管是真机调试,还是发布APP,开发者都需要经过一系列复杂的步骤
- 生成CertificateSigningRequest.certSigningRequest文件
- 获得ios_development.cer\ios_distribution.cer证书文件
- 注册device、添加AppID
- 获得*.mobileprovision文件
- 真机调试,现在的Xcode已经自动帮开发者做了以上操作
iOS签名机制的流程
- 当我们利用Xcode在真机调试时,编译,会发现以下签名步骤 signature1.png
-
iOS签名机制总体流程
signature2.png
在每台mac电脑里,都有一对密钥,分别是Mac公钥和Mac私钥。在每一台iOS设备里,都有Apple公钥。而对应的Apple私钥是存放在苹果的服务器。接下来,对上述图片进行详细解释
- 加密
- 步骤1:把APP代码及资源文件先进行哈希,得到散列值,再利用Mac私钥进行加密(即利用Mac的私钥对代码签名),最终得到APP和签名
- 步骤2:把Mac公钥利用Apple的私钥(Apple相当于CA机构)进行签名,得到证书(包括Mac公钥和签名),并包含devices,app id和entitlements(entitlements就是一些权限,比如推送,Game Center等)
- 步骤3:再次进行签名,得到mobileprovision文件
- 验证(当我们把ipa包安装到苹果手机上时,需要对ipa包进行验证)
- 利用Apple公钥(每个iOS设备里都有)解密mobileprovision中的签名,得到证书,devices、app id和entitlements的散列值,看与带过来的这些信息是否匹配。如果匹配,再进一步看当前设备是否在devices列表中,app id和entitlement与最终代码里的id和权限是否一致
- 利用Apple公钥解密证书中的签名,得到Mac公钥散列值,看与证书里的Mac公钥是否一致,从而得到Mac公钥
- 利用Mac公钥解密签名,得到App的代码和资源文件的散列值,与其上面的APP匹配,看是否一致,从而达到验证代码的目的
- 加密
- 程序在启动的时候仍旧会进行验证,如下图! signature3.png
-
结合.app的包内容说明
signature4.png
- 步骤1对应的签名文件在_CodeSignature和Mach-o文件的签名文件里。
- 步骤3对应的签名文件就是embeddedl.mobileprovision
- 答疑
- 上面的第6步,直接把Mac公钥存在每个iOS设备不就行了吗?直接Mac私钥加密,Mac公钥解密,不就简单很多,就不用像上面那样,为了得到Mac公钥,做那么多步骤?
- 不行。如果把Mac公钥存在每个iOS设备上,则整个过程就不受苹果控制了。如果Mac公钥被人篡改了怎么办。Apple的私钥在苹果服务器,肯定不会被人篡改,是绝对安全的。
- 既然每台iOS设备都有Apple公钥,那么在第1步直接用Apple私钥加密,在第6步再用Apple公钥解密,不就更方便了吗?
- 不行。因为Apple私钥在苹果的后台。如果使用Apple私钥,相当于每次真机调试都要把代码上传到苹果服务器,然后Apple加密再传回来,这样太慢了。而Mac私钥是在本地的,直接编译运行跑在真机上即可。
- 上面的第6步,直接把Mac公钥存在每个iOS设备不就行了吗?直接Mac私钥加密,Mac公钥解密,不就简单很多,就不用像上面那样,为了得到Mac公钥,做那么多步骤?
iOS签名机制与证书生成对应
- 上图中的步骤1对应的操作是:Xcode中的run操作。点击run按钮,就会利用Mac私钥对代码进行签名。
- 生成Mac设备的公私钥(CSR文件) signature5.png
- 获得证书(cer证书),相当于最上面图的第2步 signature6.png
- 生成mobileprovision文件,相当于最上面图的第3步 signature7.png
总结
- .certSigningRequest文件
- Mac公钥
- .cer文件
- 利用Apple私钥(CA),对Mac公钥生成了数字签名
- .mobileprovision
- 利用Apple私钥,对[.cer证书+devices+AppID+entitlements] 进行数字签名
App Store
- 上述复杂的步骤是为了做真机调试或者上传app到AppStore
- 用户如果从AppStore下载,则下载的安装包是经过Apple 私钥签过名的,所以直接拿每个iOS设备中的Apple公钥解密验证就行了
- 如果APP是从AppStore下载安装的,会发现里面是没有mobileprovision文件的
-
它的验证流程会简单很多,大概如下所示
signature8.png
网友评论