iOS开发同学都知道我们想要把开发好的App安装到手机(真机)上测试,需要有对应的开发者证书和描述文件才行,其实这里面就涉及到了苹果的双向签名认证机制。苹果的双向签名机制主要用到了非对称加密RSA以及哈希算法的知识,了解这个机制之后,我们会发现苹果还是非常聪明的。了解这个机制之前,建议大家先熟悉苹果开发者证书和描述文件的申请流程,不熟悉的朋友可以到我之前的文章了解一下传送门。
接下来我们就一步一步的来分析苹果的双向签名机制:
一、我们知道RSA加密的是需要一对秘钥(公钥和私钥)的,公钥加密,私钥解密,反过来也成立。苹果利用RSA加密机制在服务器端存放一个私钥(为了方便描述,我们称为私钥A),在iOS系统端存放一个公钥(和私有对应,这里称为公钥A),因为服务器和iOS系统都是苹果的,所以这个很容易做到。
二、当我们通过CSR文件去申请证书时,此时Mac系统帮我们生成了一对秘钥:公钥M和私钥M,并将公钥M放在CSR文件中到苹果服务器申请证书。
三、苹果服务器收到CSR文件后,用服务器的私钥A对公钥M进行签名得到一串HASH值,并用公钥M将公钥M和HASH值一起生成一份cer证书文件,然后我们下载到电脑上双击打开会加载到钥匙串中。之后将钥匙串中的证书导出p12文件给到其他开发者,那么其他开发者才能有权限进行真机安装调试了。
四、等到我们打包编译的时候,Xcode会根据登录的开发者账号从苹果服务器拉取对应BundleID的描述文件(其中包含设备ID列表、App ID、权限文件以及cer证书等),再用Mac电脑上的私钥M对App的资源文件和可执行文件MACHO进行签名,最后将描述文件、签名文件、以及MACHO文件等一起打包成ipa文件(注意:ipa文件实际上就是Zip文件)。
五、当我们在手机上安装App的时候,iOS系统首先用公钥A去解密证书,成功后得到公钥M,这一步的解密动作也是验证此证书是否是苹果服务器颁发的证书,验证了这个证书是苹果允许的。然后再拿解密得到的公钥M对App进行解密来验证此App是否是当前这个证书允许的,从而间接的验证了这个App是苹果服务器允许安装到手机的。其中,如果证书类型是发布证书,则是直接安装的(当然这是AppStore的安装方式);如果证书是开发证书,则需要去验证一下当前手机设备是否是允许安装的设备,通过后才能将App安装到手机上。最后附一张流程图,帮助大家理解~