浅析IOS的签名机制

前言

对IOS的签名机制,证书.cer、appid、moblieprovision它们之间到底是如何一种关系一直是模棱两可的状态,由于模棱两可,所以总是记不住,不清楚他们之间关系,所以每次出现证书不匹配问题都要去重新百度一遍,累。所以今天打算把IOS这套证书申请流程,以及各种文件之间的作用和关系梳理一下。
盗用下同事画的图(感谢我同事的用心画图)


image2019-11-25 10_27_57.png
image2019-12-2 11_6_17.png

CertificateSigningRequest.certSigningRequest

每台mac都会有一对公钥与私钥的,我们在苹果后台申请证书时,都需要CertificateSigningRequest.certSigningRequest,这个包含的内容如下:

  • 申请者信息,此信息是用申请者的私钥加密的
  • 申请者公钥,此信息是申请者使用的私钥对应的公钥
  • 摘要算法和公钥加密算法

证书.cer

之所以要上传mac公钥,是因为在制作证书时,需要把公钥放进去,上传appstore时,苹果需要从mobileprovision中拿到.cer,再从.cer中拿到mac的公钥,然后用公钥解密mac对app的签名来验证app的合法性。当我们双击安装完证书后,KeyChain会自动将这对密钥关联起来。cer包含的内容如下:

  • Mac公钥
  • 数字签名

mobileprovision

创建完证书之后,还需要创建一个appid,这个是一个应用的唯一标识,就像人的身份证一样,这里不多说。
然后还需要创建mobleprovision,在创建mobileprovision时,我们需要选择关联的证书和关联的appid(appid与mobleprovision是一对多的关系),如果是开发证书,则还需要选择设备。这些关联完后,苹果会用自己的私钥对这些内容进行数字签名,以防被篡改,所以一个完整的mobileprovision包含的内容有(上图也已经写的很清楚了):

  • 申请的数字证书.cer
  • 设备UUID
  • appid
  • 授权哪些功能entitlements
  • 以及用苹果私钥对以上内容的数字签名

到此为止,我们开发时所需要的内容已经制作完毕了:证书.cer、appid和mobileprovision。接下来梳理下它们在开发过程中的使用。

打包过程发生了什么

打包过程,Xcode会用Mac私钥对app进行数字签名(这就解释了为什么在打包过程中,苹果会验证证书里的公钥是否与mac私钥配对,如果不配对是不允许打包的,这也解释了为什么,A电脑制作的证书,如果B电脑想用,必须由A电脑导出p12给B电脑,.cer证书仅包含公钥,.p12证书可能既包含公钥也包含私钥),最终把app、app的数字签名以及mobileprovision合成ipa包。在上传appstore时,苹果会用自己的私钥对整个ipa包进行数字签名。

安装包过程发生了什么

安装过程,苹果手机会用苹果的公钥解签名mobileprovision内部的数字签名来验证其有效性,如果有效果,再用苹果公钥来验证mobileprovision内部证书的有效果性,如果有效,则拿出mac公钥,来验证app的有效性。以上都有效时才能安装成功。

结束语

在写完上面文字后,自己的思路也梳理了一遍,对IOS的签名机制也有了更深刻的记忆。以上掺杂了一些个人的理解,如果有理解不对的地方,还请看官勘误,以免误人子弟,也能纠正自己的错误认识。

你可能感兴趣的:(浅析IOS的签名机制)