IOS证书分析
最近碰到IOS打包迁移开发环境的问题,整理了一下中间的一些细节和技术。
AppID & BundleID
当需要创建一个新的App的时候,会提示需要先创建AppID
- Explicit App ID : 一个对应一个App
- Wildcard App ID : 通配符AppID。根据格式可以匹配多个应用AppID
公钥私钥加密、数字签名
对称加密和非对称加密
苹果的证书中使用大量的非对称加密技术和数字签名技术。
对称加密 : 发送方和接收方使用同样的私钥,在发送时候使用使用公钥加密,接受的使用私钥进行解密
非对称加密 :发送发使用接收方的公钥加密,接收方使用自己的私钥解密
摘要算法、数字签名
摘要算法
对数据进行计算,得出数据的识别码(摘要)。常见的MD5
或者SHA
算法都属于摘要算法的范围。算法得出来的值不可逆,而且几乎可以认为是数据的唯一识别码的(在极少数的情况下,不同数据会得出相同的摘要)。 数字签名
是对数据进行摘要算法处理,然后用私钥
对摘要进行加密。
苹果打包流程
下边这个图是申请各个证书的流程
1) 在KeyChain中向CA申请证书
向苹果申请证书后,KeyChain
中自动添加公钥私钥,同时生成.cerSigningRequest(csr)
文件
- .certSigningRequest
- 一段在SSL认证过程提交给CA的加密文本。一般情况下由认证服务器生成的,包含证书中的一些信息。诸如组织名,常用名(域名),地址,国家,邮箱地址等信息。
- 证书中的公钥也会包含在内。私钥在创建CSR的同时被创建。
- CSR文件通常根据
PKCS #10
规范用ASN.1加密。CA会用CSR来创建你的SSL认证,但是它不会需要你的**。你需要自己保存你的**,这个CSR创建的认证只能和对应的**一起使用。所以如果你丢失了**,认证就会失效。
2) 生成.cer证书
上传.cerSigningRequest
到MC
(Member Center)
开发者证书包括开发证书(Development Certificates)和发布证书(Production Certificates)
苹果的Push Notifications需要额外的SSL证书
.cer中包含证书中的信息,公钥,苹果公钥
3) 生成provisioning profile
Provisioning Profile中包含
- AppID
- 使用哪些证书
- 功能授权列表
- 可安装设备的UUID列表
-
苹果的签名。签名是苹果的,所以和我们的私钥没有关系。
这意味着,这个文件只能从MC下载,我们不能随意修改。
4) xcode使用Provisioning Profile和私钥进行签名
这个过程中,xcode会使用Provisioning Profile
xcode有自动签名的功能。会使用我们的私钥对应用的所有文件和framework进行签名。
然后再把他们压缩成ipa格式。就是我们最后的应用包啦。
根据证书的不同,可以发布到AppStore和Ad-hoc上。
5) 生成.p12文件
在团队开发的时候,我们只要在一台机器上设置好以上所有步骤。再导出.p12文件,导入到其他设备中,就可以轻松搭建环境啦。
.p12
(在windows平台下为.pfx
)相当于.cer
+ 私钥
,同时包含公钥和私钥。在导出的时候需要额外的密码对数据进行额外的加密。
6) IOS验证APP安全
IOS系统内部嵌入了整套证书验证,在启动的时候大抵会验证一下这几步:
- 对embedded.mobileprovision进行验证。
- 通过文件内的签名,使用苹果公钥验证mobileprovision文件本身有没有被修改
- 验证AppID
- 验证证书种类和证书,比如开发证书和发布证书
- 验证设备ID
- 使用_CodeSignature/CodeResources对所有文件的签名,对所有文件进行验证
如果我们要对App进行重签名,就需要在MC上创建一个新的证书,provision文件。替换掉embedded.mobileprovision文件,用新的证书对所有文件进行签名,在对framework进行签名,最后再压缩ipa文件