iOS的签名与证书机制

原文链接: https://www.jianshu.com/p/19aaa3586826

做IOS开发不多不少也有三年了,记得第一次接触IOS时,碰到的第一个问题就是这个证书,稀里糊涂的把拦路的问题搞定后,也没有进一步的去深入的探究下这个到底是什么东西,为什么要这样。

最近再搞那个使用动态库一键接入SDK的课题,再一次碰到了这个证书与签名的主题,翻阅了很多的资料,也只能说有了进一步的了解与认识,谈不上深刻,所以打算写一点东西,加深下记忆吧。说到正题之前有下面这样几个概念需要先行说明下:

1.对称加密

对称加密是密码学中一类加密算法的统称,这类算法在加密与解密时使用相同的密钥,或者使用两个可以简单的相互推算的密钥。常见的对称加密算法有DES、3DES、AES、RC5等。相比非对称加密算法,对称加密算法的优点是加解密的速度很快。

2.非对称加密

非对称加密是指加密密钥与解密密钥是成对出现的,其中一个对外公开,叫公钥,另一个末公开的叫私钥,几乎不能从一个密钥计算出另一个密钥。通过私钥加密的只能通过公钥解密,公钥加密的只能通过私钥解密。最著名的非对称加密算法是RSA算法。当然如此强大可靠的安全性是在牺牲加密速度的基础上得到的。

3.摘要算法

摘要算法可以将任意长度的信息(文本、字节等)通过算法转换成一个固定长度的文本。只要源信息不同,摘要算法得到的结果必然不同。且无法从摘要算法的结果反推得到源信息。比较典型的摘要算法有MD5与SHA等。

4.数字签名

数字签名实际上是非对称加密算法与摘要算法的结合。将要发布的源信息通过摘要算法得到摘要,再将得到的摘要通过非对称加密算法中的密钥进行加密,最后将源信息、加密后的摘要密文与解密公钥打包到一块发布。

接收方接收到信息后需要先通过公钥从摘要密文中解析出原摘要信息,然后通过摘要算法从源信息明文中再次计算出摘要信息,最后将两个接要进行比对,相等就认为一切正常。完整的流程见下图:

image

5.数字证书

数字证书就是通过数字签名实现的数字化证书。苹果的开发者证书就是这种东东,证书的签发机构(Certificate Authority)自然是Apple,证书的被签发人是企业(企业证书)或者个人开发者(个人开发证书),证书的验证方是IOS设备,IOS系统已经将整个验证流程固化到系统中,除非越狱,否则无法绕过。

接下来我们正式开始来了解IOS这个东西。还记得我们是如何向苹果申请证书的吗?不记得了得话Google下吧,一个步骤一个步骤说的非常详细。

CertificateSigningRequest.certSigningRequest

申请证书过程中苹果会要求我们从MAC电脑上上传一个后缀名为certSigningRequest的文件,见下图。

image

我们可以尝试通过openssl来查看下这个文件的内容,如下图:

image

可以看到这个文件大致包括三个方面的内容:申请者的相关信息、申请者的公钥、接要算法与公钥加密算法。

开发证书与生产证书

实际上苹果只关心这个文件中的公钥信息,它将这个公钥封装在将要分发给开发者的证书中,并进行数字签名,我们同样可以用openssl来查看证书的内容:

image

从上图签名内容的Data域中我们可以看到签名证书的相关信息,其中最重要的东西就是签名证书的公钥了。双击这个证书,MAC会自动将该证书导入到钥匙串应用中,与些同时MAC还会将本机对应的钥匙与这个证书中的公钥对应起来,因此我们在Keychain中查看证书时,可以看到证书自动的关联了私钥,如下图:

image

也正因为如此,在使用多台MAC开发机器的团队开发过程中,一般都是由一台机器申请证书后,再将证书与私钥同时导出共享给其它开发成员使用,导出截图如下图:

image

开发证书与发布证书有什么区别呢?这两种证书只是在用途上有所不同,开发证书用于开发调试应用,生产证书用于正式发布应用。本质上来说,只要这两个证书是使用同一个certSigningRequest文件生成的,他们都拥有着相同的私钥与公钥。

mobileprovision

在我们平常开发过程中除了与证书打交道外,还会碰到一个后缀为mobileprovision的文件,这个又是什么鬼呢?这个东西的中文名叫做IOS授权与描述文件。我们可以使用下面的命令来查看该文件的内容:

image

可以猜测到该文件主要包括这样几个方面的内容:App的相关信息(AppId、创建时间、面向平台等)、App所使用到的功能授权列表(正因为这个原因,我们把它称为授权与描述文件)、可以使用这个授权文件的证书列表(DeveloperCertificates这一项,使用了Base64编码,我尝试解码,也只是看到了一部分可读数据,还是有一部分的乱码文件,http://objccn.io/issue-17-2/这篇文章中说可以使用openssl x509 -text -in file.pem命令来解码,但我没有尝试成功)、可安装的设备列表(每次我们使用新的设备时,都必须先将设备UID添加到后台的设备列表中,然后重新更新该mobileprovision文件,幸运的是XCODE能够默默的为我们做到这一切,该配置只适用于开发证书)、苹果自己的签名(与上面的公钥、私钥没有关系,苹果用来验证mobileprovision文件自身的合法性)。

IPA****签名与解密

xcode在打包过程中会调用系统中的codesign命令使用账号中的私钥对应用的所有文件进行签名,并保存在ipa中的_CodeSignature文件夹下。

当App安装后,系统首先找到ipa包中的embedded.mobileprovision文件,验证这个文件自身的合法性,然后再通过该文件找到证书,再通过证书获取到解密用的公钥,解密所有经过数字签名的文件,并比较摘要是否一致。如果这些环节中的一个有问题,整个验证工作就宣告失败。

整个签名与解密的流程写的比较简略,只有一个大概的流程,究其原因还是网上很多资料对这一块言之过少,大都三言两语一带而过,希望后续自己能对其进行更进一步的补充。大致流程参见下图:

image

下面这些关于ipa签名的结论是我自己的猜测,不一定准确:

1.对于ipa包中的所有文件来说,苹果同样会获取这些文件的摘要信息,但随ipa包一块发布的却是这些文件的明文,这也是为什么我们将ipa解压后能直接读取info.plist等文件内容的原因。

3.对于所有获取的摘要信息,同样都使用私钥再次加密后保存在_CodeSignature文件夹下的CodeResources文件中。

4.苹果获取这些文件后,会对IPA包中的代码文件进行再一次的加密(用户从appstore上下载的ipa包文件中的可执行文件,使用class_dump无法正确的获取头文件,必须要使用手机执行应用,然后通过内存中的信息获取解密后的可执行文件),至于这上次的加密是否用开发者的私钥,这个我不太清楚。

4.解密时通过公钥还原摘要信息,然后根据不同的文件类型采用不同的方式获取最终的摘要信息,最后两相比较,确定文件是否发生过变更。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 做IOS开发不多不少也有三年了,记得第一次接触IOS时,碰到的第一个问题就是这个证书,稀里糊涂的把拦路的问题搞定后...
    秦砖阅读 2,572评论 4 19
  • 接触iOS开发多年,花了一点时间去研究了一下iOS这套证书和签名机制,并撰文分享给需要的朋友。由于本人才疏学浅,多...
    风和花阅读 1,867评论 0 7
  • 非对称加密和摘要非对称加密的特性和用法非对称加密算法可能是世界上最重要的算法,它是当今电子商务等领域的基石。简而言...
    哈哈哈我的简书账号阅读 1,278评论 1 5
  • 从事iOS开发三年了,日常的精力主要放在公司的业务上,最近决定开始写一些技术方面的东西,记录自己今后的学习历程,也...
    差一点不是帅哥阅读 1,737评论 0 8
  • 每每我一个人逛街回来,同学用回惊讶的说:什么,你一个人逛街?一个人逛街有什么好的。 而我私自认为——一个人逛街自有...
    紫玉云潇阅读 512评论 0 3