美文网首页iOS DeveloperiOS OC 学习手册iOS 开发
iOS代码签名机制分析(2)分析

iOS代码签名机制分析(2)分析

作者: 小武的技术渔场 | 来源:发表于2016-07-13 15:35 被阅读291次

    第一篇文章的最后,简单描述了iOS系统使用数字签名的机制。本质上就是使用RSA+信息摘要算法为基础的签名技术来对代码和图像素材资源进行签名验签。文章的最后提出了两个问题:
    **
    (1)RSA的公钥和私钥从何而来?
    (2)iOS设备如何保证该公钥和私钥合法性,并有权限对代码进行签名和验签操作?
    **
    我们通过申请苹果开发者证书,生成描述文件,生成ipa包等过程的详细描述,来说明一下以上问题如何解决。

    1,申请苹果开发者证书。

    使用KeyChain工具,生成certificateSigningRequest.CertSigningRequest。
    操作步骤:“钥匙串访问” -> “证书助理” -> “从证书颁发机构请求证书” -> “用户电子邮件地址填写:apple id;常用名称写得形象一点。”->“请求是选择存储到磁盘”

    保存在本地的就是certificateSigningRequest.CertSigningRequest文件了。如何查看这个文件的内容呢?有两种方法,第一种是使用苹果的keyChain(钥匙串访问),查看密钥。第二种是使用openssl的命令行工具。

    //查看certificateSigningRequest.CertSigningRequest的方法
    openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest
    

    总结以上步骤的产物:
    **
    a,生成私钥和公钥对。
    b,指明使用加密和签名算法(RSA+SHA1)。
    **
    最后,certificateSigningRequest.CertSigningRequest = 加密后信息+公钥+加密方法和摘要方法。
    我们就得到了,可以和苹果交互并认证的RSA的密钥对了,那么接下来的问题就是如何保证我们与苹果之间所使用的密钥对不被别的中间人所攻击或者替换呢?

    2, 上传certificateSigningRequest.CertSigningRequest文件到苹果开发者网站,苹果处理后下载开发者证书。

    这里,将certificateSigningRequest.CertSigningRequest上传的步骤保证了,你的公钥信息准确的提交给了苹果。首先,你需要有苹果的开发者账号,登录到上传certificateSigningRequest.CertSigningRequest的界面;其次,信息摘要和签名技术保证了你上传公钥的完整和有效性。因此,这个步骤保证了你的公钥被安全准确的送到了苹果的手中。苹果通过验证苹果自己在Mac主机里面的公钥(苹果公钥,非上面步骤生成),来保证你的请求是合法有效的,同时,苹果生成数字证书,对你的公钥进行了认证。

    3,导入开发者证书。

    双击证书后,系统导入到keyChain工具里,可以直接在keyChain(钥匙串访问)里面查看,还可以使用openssl查看证书内容:

    openssl x509 -inform der -in ios_development.cer -noout –text
    

    通过查看证书的内容,我们发现,苹果做的事情仅仅就是将我们的公钥原封不动的打包到证书里面,再交还给我们导入到KeyChain进行管理。苹果的这个流程,就是对我们公钥的一个认证。

    当我们的程序写好的时候,进行程序打包的过程时。我们自己手上掌握的私钥,会将程序代码和其它文件资源,使用私钥加密。

    4,真机调试。

    好了,现在打包好的程序就要进入真机调试了,真机如果要验证我们的代码和程序合法且有权限在真机运行,需要什么呢?请读者在这里想一下。

    好了,首先,就是需要公钥进行验签操作。从苹果下载的证书,就是认证后的公钥,需要放在描述文件里面,打包进入真机。此外,描述文件除了证书外,还有AppID、功能授权列表、设备列表、苹果签名等信息,对App在设备中的能力和权限做出有效的规定。
    iOS程序最终都会以.ipa文件导出,先来了解一下ipa文件的结构:

    事实上,ipa文件只是一个zip包,可以使用如下命令解压:

    /usr/bin/unzip -q xxx.ipa -d <destination>
    

    解压后,得到上图的Payload目录,下面是个子目录,其中的内容如下:
    (1) 资源文件,例如图片、html、等等。
    (2) _CodeSignature/CodeResources。这是一个plist文件,可用文本查看,其中的内容就是是程序包中(不包括Frameworks)所有文件的签名。注意这里是所有文件。意味着你的程序一旦签名,就不能更改其中任何的东西,包括资源文件和可执行文件本身。iOS系统会检查这些签名。
    (3) 可执行文件。此文件跟资源文件一样需要签名。
    (4) 一个mobileprovision文件.打包的时候使用的,从MC上生成的。
    (5) Frameworks。程序引用的非系统自带的Frameworks,每个Frameworks其实就是一个app,其中的结构应该和app差不多,也包含签名信息CodeResources文件

    验证一个ipa是否合法关键的几个点:
    (1) 解压ipa
    (2) 取出embedded.mobileprovision,通过签名校验是否被篡改过。
    (3) 校验所有文件的签名,包括Frameworks。
    (4) 比对Info.plist里面的BundleId是否符合embedded.mobileprovision文件中的AppID。

    整个过程除了技术支持(RSA+摘要算法+数字证书),还有安全流程管控(苹果开发者账号,上传公钥,苹果控制发布数字证书,认证公钥,且保证公钥合法准确)。整个机制设计,环环相扣,苹果做到对APP在真机运行和调试的有限管控。

    相关文章

      网友评论

        本文标题:iOS代码签名机制分析(2)分析

        本文链接:https://www.haomeiwen.com/subject/ocosjttx.html