我们知道苹果的签名验证采用的是双重非对称加密验证
mac电脑有一对公钥、私钥(p12),这里我们标记为“公钥M”、“私钥M”
苹果服务器和iOS设备分别对应有一对私钥、公钥,这里我们标记为“公钥A”、“私钥A”
证书-cers
- 可以通过''钥匙串"去向证书颁发机构申请
此时会得到一个CertificateSigningRequest.certSigningRequest
文件,我们将其简称为CSR文件
- CSR文件都包含了哪些信息了?
openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest
在终端通过openssl指令可以看到信息如下:
0:d=0 hl=4 l= 645 cons: SEQUENCE
4:d=1 hl=4 l= 365 cons: SEQUENCE
8:d=2 hl=2 l= 1 prim: INTEGER :00
11:d=2 hl=2 l= 64 cons: SEQUENCE
13:d=3 hl=2 l= 32 cons: SET
15:d=4 hl=2 l= 30 cons: SEQUENCE
17:d=5 hl=2 l= 9 prim: OBJECT :emailAddress
28:d=5 hl=2 l= 17 prim: IA5STRING :1054134542@qq.com
47:d=3 hl=2 l= 15 cons: SET
49:d=4 hl=2 l= 13 cons: SEQUENCE
51:d=5 hl=2 l= 3 prim: OBJECT :commonName
56:d=5 hl=2 l= 6 prim: UTF8STRING :贺超
64:d=3 hl=2 l= 11 cons: SET
66:d=4 hl=2 l= 9 cons: SEQUENCE
68:d=5 hl=2 l= 3 prim: OBJECT :countryName
73:d=5 hl=2 l= 2 prim: PRINTABLESTRING :CN
77:d=2 hl=4 l= 290 cons: SEQUENCE
81:d=3 hl=2 l= 13 cons: SEQUENCE
83:d=4 hl=2 l= 9 prim: OBJECT :rsaEncryption
94:d=4 hl=2 l= 0 prim: NULL
96:d=3 hl=4 l= 271 prim: BIT STRING
371:d=2 hl=2 l= 0 cons: cont [ 0 ]
373:d=1 hl=2 l= 13 cons: SEQUENCE
375:d=2 hl=2 l= 9 prim: OBJECT :sha256WithRSAEncryption
386:d=2 hl=2 l= 0 prim: NULL
388:d=1 hl=4 l= 257 prim: BIT STRING
这里我们将申请的信息以及“公钥M”一起打包发给苹果服务器,苹果服务器使用“私钥A”对信息进行加密,然后生成证书;这个证书则可以通过手机的“公钥A”进行解密
- 查看证书的信息
openssl x509 -text -in xxx.cer -out xxx.text
xxx.cer为证书的名称,xxx.text输出的文件名
唯一标识符-Identifiers
iOS设备安装应用时用来识别不同App的唯一标识;应用分身就是用不同的Identifier然后重签名ipa包安装到手机上
描述文件
.cer
文件只是声明了证书的类型,比如Apple Development、Apple Distribution、APNs推送等等,而使用什么证书打包及证书的有效期、AppID是什么、打包的App包含了哪些功能、可以在哪些设备上安装,则是通过Provisioning Profile
描述文件(.mobileprovision
后缀)来说明的,苹果后台将所有这些信息组合后再使用Apple私钥进行签名,最后生成Provisioning Profile
描述文件
我们Mac电脑中的描述文件存放在:~/Library/MobileDevice/Provisioning\ Profiles
目录中,我们查看下描述文件都包含哪些信息,终端执行以下命令
security cms -Di xxx.mobileprovision
<?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>AppIDName</key>
<string>XC hc RuntimeLearning</string>
<key>ApplicationIdentifierPrefix</key>
<array>
<string>L2ZY2L7GYS</string>
</array>
<key>CreationDate</key>
<date>2020-05-30T09:41:36Z</date>
<key>Platform</key>
<array>
<string>iOS</string>
</array>
<key>IsXcodeManaged</key>
<true/>
<key>DeveloperCertificates</key>
<array>
<data>加密的内容</data>
<data>加密的内容</data>
</array>
<key>Entitlements</key>
<dict>
<key>application-identifier</key>
<string>L2ZY2L7GYS.hc.RuntimeLearning</string>
<key>keychain-access-groups</key>
<array>
<string>L2ZY2L7GYS.*</string>
</array>
<key>get-task-allow</key>
<true/>
<key>com.apple.developer.team-identifier</key>
<string>L2ZY2L7GYS</string>
<key>com.apple.security.application-groups</key>
<array>
<string>group.hc.demo</string>
</array>
</dict>
<key>ExpirationDate</key>
<date>2020-06-06T09:41:36Z</date>
<key>Name</key>
<string>iOS Team Provisioning Profile: hc.RuntimeLearning</string>
<key>ProvisionedDevices</key>
<array>
<string>2e9d3a0d88ccbf9deb2efa12ea042187ef3d0ada</string>
<string>00008020-00182C413A90003A</string>
</array>
<key>LocalProvision</key>
<true/>
<key>TeamIdentifier</key>
<array>
<string>L2ZY2L7GYS</string>
</array>
<key>TeamName</key>
<string>chao he</string>
<key>TimeToLive</key>
<integer>7</integer>
<key>UUID</key>
<string>46ae42b4-6862-4d4b-9890-cc0fdf42eca2</string>
<key>Version</key>
<integer>1</integer>
</dict>
</plist>
这里推荐一个在mac下查看描述文件的插件[ProvisionQL](https://github.com/ealeksandrov/ProvisionQL)
,直接选择描述文件按空格就能看到详细信息
权限文件-entitlements
App使用到的各种权限(APNs、HealthKit、iCloud等),也是需要Apple验证通过后才能生效的,Apple将这些权限开关统一称为Entitlements。当第一次在Xcode中勾选权限时,项目中会自动生成一个.entitlements后缀的文件,里面记录了App所拥有的权限。
AppStore签名
1. 电脑端使用证书对应的私钥p12对可执行文件MachO、资源、以及Frameworks、Plugins等进行签名打包成ipa包
2. 上传ipa包到苹果服务器
3. 苹果服务器使用私钥A对app数据进行加密签名
4. 用户通过AppStore下载包之后使用手机中的公钥A进行解密验证,验证通过后安装成功
步骤1中的操作都是由Xcode帮我们完成,签名的过程也是帮我们处理了,可以在Xcode的日志中看到
非AppStore渠道分发
-
开发中连接设备到Xcode进行真机调试安装
-
AD-Hoc内部测试安装,需要先获取设备UDID并注册(Xcode11之后可以直接设备连接到Xcode Register Device去注册),并且有最多100台设备的限制
-
In-House企业内部分发,安装设备数量无限制,但安装后需主动在设置中选择信任证书
1. 电脑端使用证书对应的私钥p12对可执行文件MachO、资源、以及Frameworks、Plugins等进行签名打包成ipa包
2. 打包的过程中会将描述文件Provisioning Profile命名为embedded.mobileprovision放入到打包app中
3. 手机端安装或者启动,使用内置的公钥A验证embedded.mobileprovision是否有效设备是否在安装列表,同时验证证书签名是否有效,这包括证书的有效期(个人的调试证书有效期7天)同时取出证书中的公钥M
4. 由于app的签名是用私钥M签名的,手机拿到公钥M可以对app进行签名校验,包括AppID是否对应、权限开关是否跟app里的entitlements
一致等等
网友评论