搜索
您的当前位置:首页正文

理解ios的签名 证书机制

来源:二三娱乐

xcode 的一套 签名 证书机制,从一开始的弹框fix issure ,到xcode8 以后 Automatically manage signing,苹果在试图让这一套签名 证书机制变得透明化.本文来讲讲这背后的原理.

准备工作

首先我们应该了解,什么是签名(signature) 什么是证书 (certificate)

签名

一般仅对md5加密是为了减少加密解密的时间.

signature.jpg

证书

上述签名过程看起来已经足够安全了,接受方通过发送方公钥对签名进行解密,就能够验证数据包发送者的身份。但这都是建立在我们手中的公钥是正确的前提下的,一旦我们的公钥被替换,我们便无法解开对应发送方的签名,但更危险的是,伪造公钥的第三方,可以发送数据给我们,而我们拿着“假”的公钥,能正确解开其签名,从而误以为该数据源于我们所信任的发送方。那么如何确保公钥的安全性呢?一个很自然的想法就是为公钥进行加密。

通常的做法是,我们找到一个可信任的数字证书认证机构(Certificate Authrotiy,简称 CA),将我们自己的公钥交给 CA,随后该机构运用上述签名类似流程,用 CA 私钥加密我们的公钥,然后暴露一个 CA 公钥供使用者验解密。这个被 CA 私钥所加密的我们自己的密钥(当然还有一些像有效期、用户信息等其它内容)一般被称为证书。但这里也引入了另一个问题:解密证书所需要的公钥,同样存在被冒充的风险,如何规避这其中的风险呢?这里我并没有查到详细的资料,我想,这里公钥的正确性,便是由这些具有公信力的 CA 所保证的,而平时我们自己做业务,在网络安全方面,是难以达到这样的安全标准的。

小结

有了上面的知识储备 ,我们可以很容易地了解到,想在网络上安全的传输数据,我们一般需要两对公私钥,业务服务器的公私钥和CA的公私钥.下面我们来看看苹果是如何执行这一流程的.

ios的签名证书机制

接下来我们看看 iOS 上的签名机制,下文只讨论 AppStore 以及本地 build 这两种情况.

为什么需要

相信大家入门程序员的时候,大多都是在 VC 或 VS 上打 C/C++ 入门的,那时候一切都很简单,code-build-link-run,并没有什么认证过程,而由于苹果对其生态圈管理严格,任何在 iOS 上跑的程序都需要经过苹果的“同意”。所以,不论是 AppStore,还是 Xcode 本地 build 的项目,苹果都需要验证这个应用的身份。

AppStore

从 AppStore 下载的应用验证流程非常简单,Apple 用私钥签名 App 后,iOS 设备下载签名和 App,利用 Apple 公钥验证签名并安装。由于 iOS 设备内置 Apple 公钥,而数据包直接由苹果服务器下载,因此此处的安全是有保障的,同时,签名验证能通过,证明该安装包是从苹果服务器下载的,也就满足了苹果对 App 安装的控制。

AppStore.png

Xcode build

从 AppStore 分发应用的过程是非常简单的,但在日常开发中,上述的验证过程是不能被接受的,我们不可能每次 build 都将应用打包上传,经过苹果的加密后再下载运行。于是苹果想出了这么一套认证体系。

从 AppStore 下载应用时,iOS 设备会用 Apple 公钥验证应用安装包,以确保该应用来源于 Apple 服务器。而在本地调试模式下,设备会把对 App 的验证,改为对开发者的验证.

开发者信任.png

此处的开发者账号,就是在 Apple Developer Center 中所申请的开发者账号,一旦信任之后,每次 build 的时候,iOS 设备就将验证该开发者身份,而不是验证你 build 的 App。如此一来,便省去了应用包上传、下载的过程。我们知道,验证 App 是通过签名机制,来确定安装包来源的,而此处的验证开发者身份,又是怎样的机制呢?

验证开发者

这里面主要是做两件事:

1.iOS 设备用 Apple 公钥解密证书,所拿到的本地证书,必定是经过 Apple 服务器签名的,也就是说,这里保证了开发者是经过苹果认证的。

2.上一步拿到的公钥,用于解密 App 签名,若解密成功且验证通过,证明该 App 确实是由该开发者构建的,也就保证了 App 的安全性

流程图如下:

iosSiging.png

上述的流程唯一问题是,这个密钥是在本地生成的,如果更换了电脑,本地的密钥对就会改变。这时候,你需要将旧 mac 上的证书导出,并安装到新的电脑上。导出p12文件,拷贝到另一台电脑.

一一对应

我们能在 mac 的钥匙串访问中找到本地的密钥证书,但其它的东西似乎就不是那么地可见了,对于一般的开发者来说,我们更熟悉的概念应该是 Provisioning Profile,Xcode 8.3 提供了很友好的可视化界面来让我们查看 Provisioning Profile 里面的东西。

Provisioning profile.png  provisioning profile2.png Xcode 默认存储 Provisioning Profile 的文件夹

由于 Provisioning Profile 在 Apple 后台生成,很自然的,它也会被 Apple 私钥加密,而它的作用主要有两点:

校验 App 的各项参数(如 Capabilities,后台获取、通用链接等配置)是否与苹果后台定义的一致。

其中包含的 Certificates,也就是本地证书,用于校验开发者身份。

所以,我们可以将上一部分的图进行一些细化:

细化后的签名 证书流程

总结

至此,我们大致了解了 AppStore 以及 Xcode 本地构建时,iOS 所使用的身份验证机制了。整套验证流程其实就是对非对称加密的封装和应用,只是苹果为验证项目信息,又不想与“证书”这一专有名词混淆,加入了一个 Provisioning Profile 的概念。如果你熟悉签名、证书的概念,那么其实理解这一套验证机制也就并不困难了。

Top