签名探析

只有在越狱之后,iOS 才能运行没有签名的代码。越狱使应用可以绕过代码签名和沙盒安全机制的全部限制,这会是一个非常危险的行为。



证书和密匙


作为一个 iOS 开发者,在你开发使用的机器上应该已经有一个证书,一个公钥,以及一个私钥。这些是代码签名机制的核心。像 SSL 一样,代码签名也依赖于采用 X.509 标准的公开密钥加密。

在 OS X 上,X.509 的基本组成部分都是由一个叫钥匙串访问的工具来进行管理。打开你机器上的钥匙串访问应用,选择类别选项下的“我的证书(My Certificates)”,你可以看到所有你持有的私钥相对应的证书。要用一个证书设置代码签名,你必须拥有私钥,所以所有你拥有私钥的证书都会被列在这里。如果你拥有一个证书的私钥,你可以展开证书并将它的私钥显示出来:


如果你要导出证书,例如为了备份(强烈建议进行),一定要记得展开证书那一条显示出私钥并将两行都选中。

概括的讲,一个证书是一个公钥加上许多附加信息,这些附加信息都是被某个认证机构(Certificate Authority 简称 CA)进行签名认证过的,认证这个证书中的信息是准确无误的。对于 iOS 开发来说这个认证机构就是苹果的认证部门 Apple Worldwide Developer Relations CA。认证的签名有固定的有效期,这就意味着当前系统时间需要被正确设置,因为证书是基于当前时间进行核对。这也是为什么将系统时间设定到过去会对 iOS 造成多方面破坏的原因之一。


对于 iOS 开发来说,一般会有两个证书:一个带有前缀iPhone Developer,另一个带有前缀iPhone Distribution。前者用于使应用可以在你的测试设备上运行,后者是在提交应用到 APP store 时用到。一个证书的用途取决于它所包含的内部信息,在钥匙串访问中双击打开一个证书文件,你可以看到许多详细条目,拖动到最下面有一条标记着Apple Developer Certificate (Submission), 或者Apple Developer Certificate (Development),具体哪一种,取决于你所打开的证书是哪一种类型,iOS 系统会利用这个信息来判断你的应用是运行在开发模式下还是发布模式,并据此判断以切换应用运行规则。

为了让拥有公钥的证书起作用,我们需要有私钥。私钥是你在为组成应用的二进制文件进行签名时派上用场的。没有私钥,你就无法用证书和公钥对任何东西设置签名。

签名过程本身是由命令行工具codesign来完成的。如果你在 Xcode 中编译一个应用,这个应用构建完成之后会自动调用codesign命令进行签名,codesign也正是给你提供了许多格式友好并且有用错误信息的那一个工具。你可以在 Xcode 的 project settings 中设置代码签名信息。


需要注意的是 Xcode 只允许你在有限的选项中进行选择,这些选项都是你既拥有公钥也拥有私钥的证书。所以如果在选项中没有出现你想要的那一个,那么你需要检查的第一件事情就是你是否拥有这个证书的私钥。在这里你需要区分用于开发测试还是用于发布,如果你想要在机器上测试你的应用,你需要用用于开发测试的那一对密匙来进行签名,如果你是要发布应用,无论是给测试人员还是发布到 APP Store,你需要用用于发布的那一对密匙来进行签名。




举报

© 著作权归作者所有


0