为了确保安装到手机上的应用是经过认证的合法应用,以及能够根据应用得知其发布者,苹果制定了一个签名机制,所有安装到设备中的应用必须是拥有合法签名的应用。
一、app包
一个完整的app
包包含如下文件:
- 描述文件
- 可执行文件
-
签名信息
二、 CertificateSigningRequest.certSigningRequest
这个生成的文件中包含哪些信息呢?使用如下命令查看文件的内容,其中包含:
- 申请者信息
- 申请者公钥(和申请者使用的私钥对应)
- 摘要算法和公钥加密算法
openssl asn1parse -i -in /Users/zy/Desktop/CertificateSigningRequest.certSigningRequest
zydeMacBook-Pro:Desktop zy$ openssl asn1parse -i -in /Users/zy/Desktop/CertificateSigningRequest.certSigningRequest
0:d=0 hl=4 l= 636 cons: SEQUENCE
4:d=1 hl=4 l= 356 cons: SEQUENCE
8:d=2 hl=2 l= 1 prim: INTEGER :00
11:d=2 hl=2 l= 55 cons: SEQUENCE
13:d=3 hl=2 l= 27 cons: SET
15:d=4 hl=2 l= 25 cons: SEQUENCE
17:d=5 hl=2 l= 9 prim: OBJECT :emailAddress
28:d=5 hl=2 l= 12 prim: IA5STRING :123@sina.com
42:d=3 hl=2 l= 11 cons: SET
44:d=4 hl=2 l= 9 cons: SEQUENCE
46:d=5 hl=2 l= 3 prim: OBJECT :commonName
51:d=5 hl=2 l= 2 prim: UTF8STRING :zy
55:d=3 hl=2 l= 11 cons: SET
57:d=4 hl=2 l= 9 cons: SEQUENCE
59:d=5 hl=2 l= 3 prim: OBJECT :countryName
64:d=5 hl=2 l= 2 prim: PRINTABLESTRING :CN
68:d=2 hl=4 l= 290 cons: SEQUENCE
72:d=3 hl=2 l= 13 cons: SEQUENCE
74:d=4 hl=2 l= 9 prim: OBJECT :rsaEncryption
85:d=4 hl=2 l= 0 prim: NULL
87:d=3 hl=4 l= 271 prim: BIT STRING
362:d=2 hl=2 l= 0 cons: cont [ 0 ]
364:d=1 hl=2 l= 13 cons: SEQUENCE
366:d=2 hl=2 l= 9 prim: OBJECT :sha256WithRSAEncryption
377:d=2 hl=2 l= 0 prim: NULL
379:d=1 hl=4 l= 257 prim: BIT STRING
三、描述文件
描述文件中包含哪些信息呢?使用如下命令查看文件的内容,其中包含:
App ID
-
Entitlements
授权文件 - 使用的证书
- 可安装的设备列表
security cms -D -i /Users/zy/Desktop/embedded.mobileprovision
由于信息太多,所以新建plist
文件查看信息如下:
四、授权文件
授权文件(Entitlements
)是一个沙盒的配置列表,其中列出了哪些行为会被允许,哪些行为会被拒绝。例如,在重签应用中常常需要调试器自动附件,这时就需要在授权文件里面将get-task-allow
设置为true
。使用如下命令查看:
codesign -d --entitlements - text.app
MacBook-Pro:Debug-iphoneos zy$ codesign -d --entitlements - text.app
Executable=/Users/zy/Library/Developer/Xcode/DerivedData/text-cpghbjvznzcobegcryhayxypxuvw/Build/Products/Debug-iphoneos/text.app/text
??qq?<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>application-identifier</key>
<string>W2QAY558X9.zy.text</string>
<key>com.apple.developer.team-identifier</key>
<string>W2QAY558X9</string>
<key>get-task-allow</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>W2QAY558X9.zy.text</string>
</array>
</dict>
</plist>
MacBook-Pro:Debug-iphoneos zy$
五、签名信息
4.1 签名信息分为两份:
-
_CodeSignature
: 它的作用是用来判断一个应用程序是否完好无损,能够防止不小心修改或损坏资源文件。 -
在可执行文件中也有,如下:
六、 签名过程
先上图:
解释一下流程,需要分解三个角色:
-
Mac
电脑:内置了公钥M
以及私钥M
- 苹果服务器:私钥
A
-
iPhone
手机:内置公钥A
第一步:
通过电脑上的公钥M
传到苹果服务器。这里就是通过电脑生成的CSR
文件申请证书,其中包含了开发者信息等。
第二步:
苹果服务器通过私钥A
对公钥M
进行一次加密生成证书,证书中包括公钥M
以及公钥M
的HASH
。
第三步:
在苹果后台申请 AppID
,配置好设备ID
列表和 APP
可使用的权限,再加上第二步的证书,组成的数据用私钥 A
签名,把数据和签名一起组成一个 Provisioning Profile
文件,下载到本地 Mac
电脑。
通过Provisioning Profile
文件,苹果就可以限制可安装的设备数量和指定 APP
,避免滥用
第四步:
编译完一个 APP
后,用本地的私钥 M
对这个 APP
进行签名,同时把第三步得到的 Provisioning Profile
文件打包进 APP
里,文件名统一为embedded.mobileprovision
。
第五步:
在安装时,iPhone
手机通过内置的公钥 A,去验证 embedded.mobileprovision
的数字签名是否正确,里面的证书签名也会再验一遍。