苹果系统的安全性,依赖于一层又一层的加密,主要以摘要算法 和 非对称加密为主为主。
MC
苹果开发中心,开发者管理各种证书,配置文件的平台,简称MC。
CA
Apple Worldwide Developer Relations Certification Authority ,苹果证书签发机构,简称CA。CA有一个对公钥、私钥,为了防止理解混乱,以下分别称为CA公钥、CA私钥。CA私钥加密明文,CA公钥解密CA私钥所加密的明文。CA公钥会被内置到IOS系统的。CA私钥用于加密CertificateSigningRequest.certSigningRequest中的一些信息。
CertificateSigningRequest.certSigningRequest
Mac电脑的 钥匙串访问 生成的一个信息文件,简称CSR。该文件生成的同时Mac 电脑也生成了一对儿公钥、私钥,为了防止理解混乱,以下分别称为Mac公钥、Mac私钥。Mac私钥用于加密代码(代码签名),Mac公钥用于解密Mac私钥加密的代码。该文件包含以下内容
- 开发者信息。例如:常用名称,邮件地址。
- Mac公钥。
该文件如果直接使用 文本编辑 打开会看到一大堆二进制,想要看明文,可以输入以下命令对该文件进行解密。
localhost:~ wany$ openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest
证书
证书分为开发证书和发布证书。证书中包含了以下几个信息
- Mac公钥
- 数字签名。摘要算法加密CSR内容=ABC,CA私钥加密ABC=数字签名。
- 证书基本信息。
该文件如果直接使用 文本编辑 打开会看到一大堆二进制,想要看明文,可以输入以下命令对该文件进行解密
localhost:~ wany$ openssl x509 -inform der -in ios_development.cer -noout -text
我们可以用openssl来解析文件中的内容一窥究竟:
授权和描述文件
证书能够证明app的所属以及app的完整性,保证app本身是安全的。但是,却不能细化到app所使用的某些服务是被苹果认可的,比如APN推送服务。而且证书无法限制调试版的app的装机规模。于是,诞生了mobileprovision。你可以使用如下命令查看一个mobileprovision:
security cms -D -i embedded.mobileprovision
mobileprovision文件包含:
- AppId。每个app必须在MC中创建一个对应的AppId。规则不累述了。
- 使用哪些证书。上面说了,不同类型的证书就代表了不同的发布方式,还包括一些功能的能否使用(比如APN)
- 功能授权列表
- 可安装的设备列表。对于AdHoc方式发布的app或者真机调试时,会有一个列表,这个列表里面是iOS设备的UDID,每台iOS设备出厂的UDID都不同,所以可以用来标识设备。可通过iTunes连接设备,或者 点这里获取
苹果的签名!
注意5,这里的签名是苹果签的,跟我们的私钥没有关系。也就是说mobileprovision文件是苹果签名的,我们除了从MC中获取,别无他法。也不能再获取后随意篡改(比如添加别的设备)。
申请证书-流程
MAC 电脑通过 钥匙串访问 生成CSR,CSR提交到MC,MC将CSR提交给CA,CA解析CSR内容,CA使用摘要算法加密解析出的CSR内容,加密后的CSR内容使用CA私钥进一步加密。CA新建一个空白的证书,空白证书内添加CSR中的MAC公钥、CA私钥加密后的内容、证书基本信息。证书返回给MC,MC返回给MAC电脑。
Xcode 打包APP
创建_CodeSignature文件夹以及子文件CodeResources,使用摘要算法加密项目内所有资源文件(非代码),例如图片、nib,plist,逐个创建键值对: key = 资源名称,value=该资源内容使用摘要算法加密后的密文,键值对插入CodeResources文件。创建可执行Mach-O 二进制文件,所有项目代码添加进该Mach-O 二进制文件,使用MAC私钥对该Mach-O 二进制文件进行加密,加密后的密文写入该Mach-O 二进制文件,将Mach-O 二进制文件、_CodeSignature文件夹、描述文件(Profile)和其他资源打包为一个.ipa的压缩包。
APP安装到iPhone 验证流程
.ipa 安装到iPhone,提取ipa中包含的描述文件,解密描述文件中证书文件密文,解析证书内CSR内容,使用摘要算法加密CSR内容,加密后CSR内容这里称为ABC。IOS系统读取内置CA公钥,同时读取证书使用CA私钥加密的密文,使用CA公钥解析该密文,该密文这里称为CBD,如果ABC等于CBD,可以确定该证书是合法有效的。读取证书内MAC公钥,解密ipa内_CodeSignature文件夹下的CodeResources的内容,逐个比对验证资源的正确的。提取可执行二进制文件Mach-O中的签名信息进行解密,验证其有效性。全部验证通过,app就可以顺利运行了。
查看app是否支持推送
$ codesign -d --entitlements - Example.app
查看输出的app授权是否包含 aps-environment ,可确定推送环境是否正确。