陈斌彬的技术博客

Stay foolish,stay hungry

代码签名查看命令行工具 Security

$ security find-identity -v -p codesigning  

img

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

img

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

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

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

img

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

一直以来,以上这些就是代码签名需要设置的全部,设置了这些就几乎完成了。

但是在 Xcode 6 的 project settings 中出现了设置配置文件的选项。如果你选择了某一个配置文件,你必须选择这个配置文件的证书中所包含的公钥所对应的那个密匙对,或者你可以选择让 Xcode 自动完成正确的设置。关于这方面我们稍后再详细说明,首先还是回到代码签名。

Resource Reference