非对称加密
- 百度百科:非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。甲方想要回复乙方时正好相反,使用乙方的公钥对数据进行加密,同理,乙方使用自己的私钥来进行解密。说到底,公钥加密只能用对应的私钥解密;
- 苹果开发过程中配置证书时,生成了两对公私钥对,本地Mac电脑的公私钥对和苹果生成的公私钥对,本地Mac的公私钥对在本地生成,公钥用于上传到苹果加密数据,私钥用于APP签名安装时用于验证安装;苹果的私钥用于加密生成Cer证书,公钥则存放在每个苹果设备中用于验证APP安装;
证书
- Provisioning Profile:Provisioning Profile 里就包含了证书信息、设备 ID / AppID、APP 可能设置的 iCloud / push / 后台运行 等权限的所有额外信息,以及所有信息的签名等;
- entitlements:entitlements是当我们设置授权机制,例如推送、支付等,也即是Xcode 的 Capabilities下开启对应的功能时,系统会自动为我们生成.entitlements文件;
- CertificateSigningRequest:CertificateSigningRequest即是CSR文件,通过钥匙串访问生成,存放着Mac电脑生成的公钥,而私钥则存放在Mac电脑本机,后续苹果生成cer证书需上传此证书;
- p12:p12包含了CER文件及私钥信息,当我们想在其他Mac电脑上打包时,需要把我们的私钥导出为p12加密文件供他人安装使用;
- AppID:AppID存放的是我们开发的APP的bundle identifier,APP的唯一标识;
- cer:将本地的Mac公钥上传到苹果开发者账号上面与苹果的私钥加密生成的cer配置证书;
- 设备ID:用户手机的UDID,用于识别每个手机唯一标志;
调试or打包
下文步骤及图片引用自文章iOS App 签名的原理
- 连接调试
电脑连接调试步骤:
- 在你的 Mac 开发机器生成一对公私钥,这里称为公钥L,私钥L。L:Local
- 苹果自己有固定的一对公私钥,跟上面 AppStore 例子一样,私钥在苹果后台,公钥在每个 iOS 设备上。这里称为公钥A,私钥A。A:Apple
- 把公钥 L 传到苹果后台,用苹果后台里的私钥 A 去签名公钥 L。得到一份数据包含了公钥 L 以及其签名,把这份数据称为证书。
- 在开发时,编译完一个 APP 后,用本地的私钥 L 对这个 APP 进行签名,同时把第三步得到的证书一起打包进 APP 里,安装到手机上。
- 在安装时,iOS 系统取得证书,通过系统内置的公钥 A,去验证证书的数字签名是否正确。
- 验证证书后确保了公钥 L 是苹果认证过的,再用公钥 L 去验证 APP 的签名,这里就间接验证了这个 APP 安装行为是否经过苹果官方允许。(这里只验证安装行为,不验证APP 是否被改动,因为开发阶段 APP 内容总是不断变化的,苹果不需要管。)
总结:把本地生成的公钥L上传到苹果后台用苹果私钥A签名生成证书,再用本地私钥L对APP签名,同时把后台生成的证书一起打包进APP,安装到手机上时,通过苹果手机内置公钥A进行验证证书签名是否正确,再通过验证解密出来的公钥L去验证用APP中的本地私钥是否允许安装!
- 打包调试
打包或管理合适安装设备:
- 在你的 Mac 开发机器生成一对公私钥,这里称为公钥L,私钥L。L:Local
- 苹果自己有固定的一对公私钥,跟上面 AppStore 例子一样,私钥在苹果后台,公钥在每个 iOS 设备上。这里称为公钥A,私钥A。A:Apple
- 把公钥 L 传到苹果后台,用苹果后台里的私钥 A 去签名公钥 L。得到一份数据包含了公钥 L 以及其签名,把这份数据称为证书。
- 在苹果后台申请 AppID,配置好设备 ID 列表和 APP 可使用的权限,再加上第③步的证书,组成的数据用私钥 A 签名,把数据和签名一起组成一个 Provisioning Profile 文件,下载到本地 Mac 开发机。
- 在开发时,编译完一个 APP 后,用本地的私钥 L 对这个 APP 进行签名,同时把第④步得到的 Provisioning Profile 文件打包进 APP 里,文件名为 embedded.mobileprovision,把 APP 安装到手机上。
- 在安装时,iOS 系统取得证书,通过系统内置的公钥 A,去验证 embedded.mobileprovision 的数字签名是否正确,里面的证书签名也会再验一遍。
- 确保了 embedded.mobileprovision 里的数据都是苹果授权以后,就可以取出里面的数据,做各种验证,包括用公钥 L 验证APP签名,验证设备 ID 是否在 ID 列表上,AppID 是否对应得上,权限开关是否跟 APP 里的 Entitlements 对应等。
总结:把本地生成的公钥L上传到苹果后台用苹果私钥A签名生成Cer证书,不过苹果为了限制允许安装设备及一些需配置的权限,用了Profile文件来另外装载这些配置信息,Profile文件需将Cer证书及APPID等一起生成,下载安装到本地Mac;编译打包时将本地的私钥L与Profile文件一起打包进APP,当APP安装到手机时,还是通过苹果手机内置的公钥A去验证Profile签名及Cer证书的正确性,当验证成功,则证明签名是经苹果认证授权的,接下来再取出解密后的数据,进行验证设备及权限等信息正确性,当然也会用本地公钥L去验证APP签名正确性,验证成功后APP则可在手机安装了!(简单来说验证苹果Cer及Profile是为了看是否获得苹果授权认证,验证本地公钥是为了看是否是用本地私钥打包签名的APP,若两者验证都通过,则安装可在手机设备上安装使用了!!!)