苹果IOS代码签名

2019-05-29 11:35

心得: 签名其实就是一个hash值,一个文件的hash值是唯一的,因此签名的人(假设为A)得到的hash和使用的人(假设为B)对同一份数据使用相同hash算法得到的hash应该是一致的。签名的时候A把那个hash值用A的私钥加密一下放在文件里,使用者B使用的时候用A的公钥解密一下并且看看跟自己得到的hash是不是一样,一样才说明是同一个文件。同时,因为使用者B用签名人A的公钥正确解密了签名,也说明了文件确实是被签名人A签的名,而不是别人。

ios企业签名   1.签名实际上是把原数据进行一个hash,得到的hash用私钥加密,加密后的摘要就是签名。这个摘要会放入原文件里,有这个摘要的文件就是被签名过的。

                       2.我们的代码,资源文件,证书等等,签名前后原数据都是不变的,验证过程就是重新对原数据hash一次,将得到的hash跟解密后的摘要比较的过程,并不是比较原数据,只是比较那个信息摘要。

                       3.打包的时候会把签名用的provision profile也放进包里,这个文件包含签名的证书,证书里有Apple的签名。(从appstore下载的包里是没有描述文件的,因为它们都被苹果自己重新签名了,否则ios要安装非常多的个人开发者证书才能对所有开发者的签名进行验证。我们个人开发者的签名实际上只在提交时被苹果验证。在调试,archive时候会有描述文件打在包里,上传包时苹果用包里的描述文件验证上传者和包的完整性,验证完了后对包重新签名,去除包里的描述文件。
                        4.Apple对证书签名的过程是指:对证书进行哈希计算,得到一个摘要信息,然后用Apple的私钥对摘要信息进行加密并且放入证书文件内。

   ios运行一个app之前,要先验证它包里的provison profile指定的证书,然后验证所有文件:
   1.ios对证书检查的过程是:对证书进行哈希计算,得到结果1,将证书的签名使用apple的公钥进行解密,得到结果2,比较结果1和2,如果一致说明证书是没有问题的。
   2.对二进制文件和资源文件的验证跟证书验证相同。此时证书已被信任,因此可以用证书对其他文件进行验证。例如对于可执行文件 a,   对a进行hash,得到h1; 将a的签名用证书进行解密,得到h2,   如果h1 == h2, 则a完整无问题,并且来源是受信任的开发者。

000126

第二篇文章的部分笔记:

1.签名
$ codesign -s 'iPhone Developer: Thomas Kollbach (7TPNXN7G6K)' Example.app

2.重新签名
$ codesign -f -s 'iPhone Developer: Thomas Kollbach (7TPNXN7G6K)' Example.app
3.查看签名状态信息
codesign -vv -d Example.app

4.检查签名是否完好

$ codesign --verify Example.app

为一个程序包设置签名时,除了可执行文件,包里的所有资源文件也会被设置签名。

为了达到为所有文件设置签名的目的,签名的过程中会在程序包中新建一个叫做 _CodeSignatue/CodeResources 的文件,这个文件中存储了被签名的程序包中所有文件的签名。
这个列表文件中不光包含了文件和它们的签名的列表,还包含了一系列规则,这些规则决定了哪些资源文件应当被设置签名。你可以自己去查看这个签名列表文件,它仅仅是一个 plist 格式文件。
这个列表文件中不光包含了文件和它们的签名的列表,还包含了一系列规则,这些规则决定了哪些资源文件应当被设置签名。伴随 OS X 10.10 DP 5 和 10.9.5 版本的发布,苹果改变了代码签名的格式,也改变了有关资源的规则。如果你使用10.9.5或者更高版本的 codesign 工具,在 CodeResources 文件中会有4个不同区域,其中的 rulesfiles 是为老版本准备的,而 files2rules2是为新的第二版的代码签名准备的。最主要的区别是在新版本中你无法再将某些资源文件排除在代码签名之外,在过去你是可以的,只要在被设置签名的程序包中添加一个名为 ResourceRules.plist 的文件,这个文件会规定哪些资源文件在检查代码签名是否完好时应该被忽略。但是在新版本的代码签名中,这种做法不再有效。所有的代码文件和资源文件都必须设置签名,不再可以有例外。在新版本的代码签名规定中,一个程序包中的可执行程序包,例如扩展 (extension),是一个独立的需要设置签名的个体,在检查签名是否完整时应当被单独对待。

授权机制
授权机制决定了哪些系统资源在什么情况下允许被一个应用使用。简单的说它就是一个沙盒的配置列表,上面列出了哪些行为被允许,哪些会被拒绝。
获取授权信息

codesign -d --entitlements - xxxx.app

在新版本的 Xcode 6 之后,授权信息列表会以 Example.app.xcent 这样的名字的文件形式包含在应用包中。

配置文件:
如果你要在自己的机器上找到配置文件,在这个目录下~/Library/MobileDevice/Provisioning Profiles。Xcode 将从开发者中心下载的全部配置文件都放在了这里。
Xcode 会将你在 project setting 中选择的配置文件打包进应用

命令行工具 security 也可以解码这个 CMS 格式,那么我们就用 security 来看看一个 .mobileprovision 文件内部是什么样子:
$ security cms -D -i example.mobileprovision
首先来看 DeveloperCertificates 这项,这一项是一个列表,包含了可以为使用这个配置文件的应用签名的所有证书。如果你用了一个不在这个列表中的证书进行签名,无论这个证书是否有效,这个应用都无法运行